是一个简单但功能完整的 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' => __('« 上一页'),
'next_text' => __('下一页 »'),
'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
}
?>
没有回复内容