WordPress 访问 IP 记录插件-资讯论坛-小武站

WordPress 访问 IP 记录插件

是一个简单但功能完整的 WordPress 插件,用于记录访问者的 IP 地址、访问时间和访问页面。这个插件会在后台创建一个管理页面,方便查看所有访问记录。

插件功能说明

这个 IP 访问记录插件具有以下功能:

 

  1. 记录信息:自动记录访问者的 IP 地址、访问时间、访问页面 URL 和用户代理信息
  2. 防重复记录:同一 IP 在 10 分钟内访问同一页面不会重复记录
  3. 管理界面:在 WordPress 后台提供直观的管理页面,展示所有访问记录
  4. 分页功能:记录较多时自动分页,默认每页显示 50 条记录
  5. 删除功能:可以一键删除所有访问记录
  6. 排除管理员:不会记录网站管理员的访问信息

安装使用方法

  1. 将上述代码复制到一个文本编辑器中
  2. 保存为 ip-tracker.php 文件
  3. 压缩成 ZIP 文件
  4. 在 WordPress 后台通过 "插件 > 安装插件 > 上传插件" 进行安装
  5. 激活插件后,在 WordPress 后台左侧菜单会出现 "IP 访问记录" 选项

 

插件激活时会自动创建数据库表,无需额外配置即可使用。所有记录会按照访问时间倒序排列,最新的访问记录会显示在最前面。

 

如果需要自定义记录间隔时间或每页显示数量,可以修改代码中相应的参数。
<?php
/*
Plugin Name: IP访问记录器
Plugin URI: https://example.com/
Description: 记录网站访问者的IP地址、访问时间和访问页面
Version: 1.0
Author: Your Name
Author URI: https://example.com/
License: GPL2
*/

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

// 激活插件时创建数据库表
register_activation_hook(__FILE__, 'ip_tracker_install');

function ip_tracker_install() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'ip_tracker';
    
    $charset_collate = $wpdb->get_charset_collate();
    
    $sql = "CREATE TABLE $table_name (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        ip_address varchar(45) NOT NULL,
        visit_time datetime NOT NULL,
        page_url text NOT NULL,
        user_agent text,
        PRIMARY KEY  (id)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}

// 记录访问信息
add_action('wp_head', 'ip_tracker_log_visit');

function ip_tracker_log_visit() {
    // 不记录管理员访问
    if (current_user_can('manage_options')) {
        return;
    }
    
    global $wpdb;
    $table_name = $wpdb->prefix . 'ip_tracker';
    
    // 获取IP地址
    $ip_address = ip_tracker_get_user_ip();
    
    // 获取当前页面URL
    $page_url = home_url(add_query_arg(array(), $wp->request));
    
    // 获取用户代理
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    
    // 检查该IP在过去10分钟内是否访问过同一页面
    $ten_minutes_ago = date('Y-m-d H:i:s', strtotime('-10 minutes'));
    $existing = $wpdb->get_var(
        $wpdb->prepare(
            "SELECT id FROM $table_name WHERE ip_address = %s AND page_url = %s AND visit_time >= %s",
            $ip_address,
            $page_url,
            $ten_minutes_ago
        )
    );
    
    // 如果10分钟内同一IP访问同一页面,则不重复记录
    if (!$existing) {
        $wpdb->insert(
            $table_name,
            array(
                'ip_address' => $ip_address,
                'visit_time' => current_time('mysql'),
                'page_url' => $page_url,
                'user_agent' => $user_agent
            )
        );
    }
}

// 获取用户真实IP地址
function ip_tracker_get_user_ip() {
    // 检查代理IP
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    
    // 处理多个IP地址的情况
    if (strpos($ip, ',') !== false) {
        $ip = trim(explode(',', $ip)[0]);
    }
    
    return $ip;
}

// 添加管理菜单
add_action('admin_menu', 'ip_tracker_add_admin_menu');

function ip_tracker_add_admin_menu() {
    add_menu_page(
        'IP访问记录',
        'IP访问记录',
        'manage_options',
        'ip-tracker',
        'ip_tracker_admin_page',
        'dashicons-visibility',
        6
    );
}

// 管理页面内容
function ip_tracker_admin_page() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'ip_tracker';
    
    // 处理删除操作
    if (isset($_POST['delete_all']) && wp_verify_nonce($_POST['ip_tracker_nonce'], 'ip_tracker_delete_all')) {
        $wpdb->query("TRUNCATE TABLE $table_name");
        echo '<div class="notice notice-success is-dismissible"><p>所有记录已删除</p></div>';
    }
    
    // 获取记录总数
    $total_records = $wpdb->get_var("SELECT COUNT(*) FROM $table_name");
    
    // 分页设置
    $per_page = 50;
    $paged = isset($_GET['paged']) ? max(1, intval($_GET['paged'])) : 1;
    $offset = ($paged - 1) * $per_page;
    
    // 获取记录
    $records = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT * FROM $table_name ORDER BY visit_time DESC LIMIT %d OFFSET %d",
            $per_page,
            $offset
        )
    );
    
    // 计算总页数
    $total_pages = ceil($total_records / $per_page);
    
    ?>
    <div class="wrap">
        <h1>IP访问记录</h1>
        
        <form method="post" onsubmit="return confirm('确定要删除所有记录吗?');">
            <?php wp_nonce_field('ip_tracker_delete_all', 'ip_tracker_nonce'); ?>
            <p class="submit">
                <input type="submit" name="delete_all" class="button button-danger" value="删除所有记录">
            </p>
        </form>
        
        <p>总记录数: <?php echo $total_records; ?></p>
        
        <table class="wp-list-table widefat fixed striped">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>IP地址</th>
                    <th>访问时间</th>
                    <th>访问页面</th>
                    <th>用户代理</th>
                </tr>
            </thead>
            <tbody>
                <?php if ($records) : ?>
                    <?php foreach ($records as $record) : ?>
                        <tr>
                            <td><?php echo $record->id; ?></td>
                            <td><?php echo esc_html($record->ip_address); ?></td>
                            <td><?php echo esc_html($record->visit_time); ?></td>
                            <td><a href="<?php echo esc_url($record->page_url); ?>" target="_blank"><?php echo esc_html($record->page_url); ?></a></td>
                            <td><?php echo esc_html($record->user_agent); ?></td>
                        </tr>
                    <?php endforeach; ?>
                <?php else : ?>
                    <tr>
                        <td colspan="5" class="text-center">没有记录</td>
                    </tr>
                <?php endif; ?>
            </tbody>
        </table>
        
        <?php
        // 分页导航
        if ($total_pages > 1) {
            $page_links = paginate_links(array(
                'base' => add_query_arg('paged', '%#%'),
                'format' => '',
                'prev_text' => __('&laquo; 上一页'),
                'next_text' => __('下一页 &raquo;'),
                'total' => $total_pages,
                'current' => $paged
            ));
            
            if ($page_links) {
                echo '<div class="tablenav"><div class="tablenav-pages" style="margin: 1em 0;">';
                echo $page_links;
                echo '</div></div>';
            }
        }
        ?>
    </div>
    <?php
}
?>