wordpress 蜘蛛记录插件的功能记录网站的所有访问记录

要在 WordPress 网站上实现类似的功能,通常你需要开发一个 WordPress 插件。以下是一步步创建一个插件的指南,它可以记录访问者的访问记录,区分搜索引擎蜘蛛,并保存访客的 IP 地址。

1. 创建插件目录和文件

  1. 进入你的 WordPress 插件目录。路径通常是:
wp-content/plugins/
  1. plugins 文件夹中创建一个新目录,例如:visitor-tracker
  2. visitor-tracker 目录中创建一个 PHP 文件,例如:visitor-tracker.php

2. 插件文件结构

插件的文件结构大概如下:

wp-content/
    plugins/
        visitor-tracker/
            visitor-tracker.php

3. 编写插件代码

visitor-tracker.php 文件中,添加以下代码:

<?php
/**
 * Plugin Name: Visitor Tracker
 * Plugin URI: https://yourwebsite.com
 * Description: A simple plugin to track visitors and identify search engine bots.
 * Version: 1.0
 * Author: Your Name
 * Author URI: https://yourwebsite.com
 */

// 确保 WordPress 已加载
if (!defined('ABSPATH')) {
    exit; // 禁止直接访问
}

// 定义数据库表名
global $visitor_tracker_table;
$visitor_tracker_table = 'wp_visitor_logs';

// 插件激活时创建数据库表
function vt_create_table() {
    global $wpdb, $visitor_tracker_table;
    $charset_collate = $wpdb->get_charset_collate();
    
    // 创建数据库表
    $sql = "CREATE TABLE IF NOT EXISTS $visitor_tracker_table (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
        visitor_type VARCHAR(50),
        user_agent TEXT,
        ip_address VARCHAR(100),
        spider_name VARCHAR(100)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(__FILE__, 'vt_create_table');

// 插件停用时删除数据库表
function vt_remove_table() {
    global $wpdb, $visitor_tracker_table;
    $sql = "DROP TABLE IF EXISTS $visitor_tracker_table";
    $wpdb->query($sql);
}
register_deactivation_hook(__FILE__, 'vt_remove_table');

// 访问记录处理函数
function vt_log_visitor() {
    global $wpdb, $visitor_tracker_table;
    
    // 获取访客的 IP 地址
    $ip_address = $_SERVER['REMOTE_ADDR'];
    
    // 获取 User-Agent
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    
    // 判断是否为搜索引擎蜘蛛
    $spiders = ['Googlebot', 'Bingbot', 'Slurp', 'DuckDuckBot', 'Baiduspider', 'YandexBot', 'Sogou', 'Exabot'];
    $is_spider = false;
    $spider_name = '';
    
    foreach ($spiders as $spider) {
        if (strpos($user_agent, $spider) !== false) {
            $is_spider = true;
            $spider_name = $spider;
            break;
        }
    }
    
    // 记录访客或蜘蛛
    $visitor_type = $is_spider ? 'Spider' : 'Visitor';
    
    // 将访问记录保存到数据库
    $wpdb->insert(
        $visitor_tracker_table,
        [
            'visitor_type' => $visitor_type,
            'user_agent' => $user_agent,
            'ip_address' => $ip_address,
            'spider_name' => $is_spider ? $spider_name : null
        ]
    );
}

// 捕获所有页面请求
add_action('wp_head', 'vt_log_visitor');

// 创建管理页面以查看记录
function vt_add_admin_menu() {
    add_menu_page(
        'Visitor Tracker Logs', // 页面标题
        'Visitor Tracker', // 菜单标题
        'manage_options', // 权限要求
        'visitor-tracker-logs', // 菜单 slug
        'vt_display_logs', // 回调函数
        'dashicons-visibility', // 图标
        30 // 位置
    );
}
add_action('admin_menu', 'vt_add_admin_menu');

// 显示日志的回调函数
function vt_display_logs() {
    global $wpdb, $visitor_tracker_table;
    
    $logs = $wpdb->get_results("SELECT * FROM $visitor_tracker_table ORDER BY timestamp DESC LIMIT 20");
    
    echo '<div class="wrap">';
    echo '<h1>Visitor Tracker Logs</h1>';
    
    if ($logs) {
        echo '<table class="wp-list-table widefat fixed striped">';
        echo '<thead><tr><th>ID</th><th>Timestamp</th><th>Visitor Type</th><th>IP Address</th><th>Spider Name</th><th>User Agent</th></tr></thead>';
        echo '<tbody>';
        
        foreach ($logs as $log) {
            echo '<tr>';
            echo '<td>' . $log->id . '</td>';
            echo '<td>' . $log->timestamp . '</td>';
            echo '<td>' . $log->visitor_type . '</td>';
            echo '<td>' . $log->ip_address . '</td>';
            echo '<td>' . ($log->spider_name ? $log->spider_name : '-') . '</td>';
            echo '<td>' . $log->user_agent . '</td>';
            echo '</tr>';
        }
        
        echo '</tbody>';
        echo '</table>';
    } else {
        echo '<p>No logs available.</p>';
    }
    
    echo '</div>';
}

解释:

  1. 插件头部信息Plugin NameDescriptionVersion 等字段描述了插件的基本信息。
  2. 数据库表创建
    • 插件激活时会创建一个名为 wp_visitor_logs 的表,存储访问记录。表中包括字段 idtimestampvisitor_type(访客类型)、user_agent(用户代理)、ip_address(IP 地址)、spider_name(蜘蛛名称)。
  3. 访问记录
    • 通过 wp_head 钩子函数,每次访问页面时会记录访问者的信息。如果访问者是搜索引擎蜘蛛,则会记录蜘蛛的名称;否则,记录访客的 IP 地址。
  4. 管理界面
    • 插件创建了一个 WordPress 后台菜单项,允许管理员查看最近的访问日志。显示的字段包括访问时间、访客类型、IP 地址、蜘蛛名称和用户代理。

4. 启用插件

  1. visitor-tracker 文件夹上传到你的 WordPress 插件目录中:wp-content/plugins/
  2. 登录到 WordPress 后台,进入 插件 页面,启用 Visitor Tracker 插件。

5. 查看访问记录

启用插件后,后台会出现一个新的菜单项 Visitor Tracker,点击该菜单可以查看最近的访问日志,包括访客的 IP 地址、蜘蛛名称和用户代理。

总结

这个插件实现了以下功能:

  • 捕获并记录访问网站的访客和搜索引擎蜘蛛。
  • 对于蜘蛛,记录蜘蛛类型(如 Googlebot、Bingbot 等)。
  • 对于访客,记录 IP 地址。
  • 提供一个后台界面,让管理员可以查看记录的日志。

如果你有任何进一步的定制要求,或者需要帮助解决其他问题,请随时告诉我!

发布者:myrgd,转载请注明出处:https://www.object-c.cn/4411

Like (0)
Previous 2024年11月22日 下午4:05
Next 2024年11月22日 下午5:54

相关推荐

  • 在 React Native 0.72.5 中使用 Hermes 引擎时JavaScript 的 Function.prototype.toString() 转成字符串

    在 React Native 0.72.5 中,使用 Hermes 引擎时,JavaScript 的 Function.prototype.toString() 方法的行为可能与其他 JavaScript 引擎(如 V8 或 JavaScriptCore)有所不同。这种差异源于 Hermes 的设计,旨在提升性能和减少内存开销。 问题描述 在 Hermes …

    2024年12月7日
    00
  • Windows 系统中使用 VSCode 配置 C/C++ 开发环境教程

    在 Windows 系统中使用 VSCode 配置 C/C++ 开发环境,可以高效编写和调试代码。以下是详细步骤: 1. 安装必要工具 1.1 安装 VSCode 1.2 安装 C/C++ 编译器 推荐使用 MinGW-w64: 验证是否安装成功: 2. 安装 VSCode 插件 打开 VSCode 的扩展市场(Ctrl+Shift+X),搜索并安装以下插件…

    2024年11月26日
    00
  • C++ STL vector 类:动态数组的高效应用

    vector 是 C++ 标准库(STL)中最常用的容器之一,它提供了一个动态数组的实现,能够根据需要自动扩展或收缩。vector 是一个线性数据结构,具有高效的随机访问能力和动态扩展能力,广泛应用于需要频繁增删元素且对随机访问要求较高的场景。 1. vector 类简介 vector 是 C++ 标准模板库(STL)中提供的一种容器类,它类似于动态数组(d…

    2024年11月25日
    00
  • Android 解决 “Module was compiled with an incompatible version of Kotlin“

    “Module was compiled with an incompatible version of Kotlin” 错误通常出现在 Android 开发中,因为模块的 Kotlin 编译器版本与项目中的 Kotlin 编译器版本不匹配。以下是解决此问题的方法: 1. 检查 Kotlin 插件版本步骤:打开 Android Studio。点击顶部菜单的 …

    2024年11月26日
    00
  • Unity 项目升级URP/HDRP渲染管线时如何解决材质丢失问题

    在 Unity 项目中升级到 URP(通用渲染管线) 或 HDRP(高清渲染管线) 后,材质丢失是一个常见问题。这通常是因为原来的材质或着色器不兼容新渲染管线,需要手动调整或重新配置。以下是详细的解决方法: 1. 理解渲染管线的变化 2. 自动转换材质(官方工具) Unity 提供了从 Built-in 渲染管线迁移到 URP 或 HDRP 的官方工具,可以…

    2024年11月25日
    00
  • Web实时通信和 @microsoft/signalr 微软开发的一款基于 SignalR 的实时通信库

    Web实时通信和 @microsoft/signalr@microsoft/signalr 是微软开发的一款基于 SignalR 的实时通信库,专为 Web 应用提供强大的实时通信功能。SignalR 的主要特点包括支持双向通信、自动选择传输协议(WebSockets、Server-Sent Events 或 Long Polling)以及简化的服务器与客户…

    2024年12月1日
    00
  • 在进行 Java 单元测试时,遇到找不到类名的错误

    在进行 Java 单元测试时,遇到找不到类名的错误,通常是由于以下几个原因引起的。下面是一些常见问题及其解决方法:1. 类路径(Classpath)问题最常见的原因是编译后的类文件没有正确地包含在类路径中,或者类文件没有被正确加载到测试框架中。要解决这个问题,确保以下几点:解决方法:确认类是否存在:首先确保测试类和目标类都已经编译,并且在正确的目录中。检查 …

    2024年11月28日
    00
  • Python与Jupyter Notebook中的数据可视化实现

    数据可视化是分析和展示数据的重要手段,而 Python 与 Jupyter Notebook 是构建交互式数据可视化的重要工具组合。以下是如何在 Python 和 Jupyter Notebook 中实现数据可视化的详细介绍。 1. 常用数据可视化库Python 中有多个强大的可视化库,以下是几个常用的:1.1 Matplotlib特点:功能强大、灵活,但语…

    2024年11月26日
    00
  • 在 Go 语言中,对文件的基础操作介绍

    在 Go 语言中,文件操作是基础技能之一,主要通过 os、io 和 io/ioutil 等标准库完成。以下是对文件操作的全面介绍,帮助你在 Go 语言的“成神之路”上迈出关键一步! 1. 创建文件使用 os.Create 创建文件,如果文件已存在会被清空。示例代码 2. 打开文件使用 os.Open 打开文件(只读模式),使用 os.OpenFile 可以指…

    2024年12月2日
    00
  • 将FFmpeg集成到 Spring Cloud构建分布式系统 对视频压缩处理

    在使用Spring Cloud构建分布式系统时,可以将FFmpeg集成到其中,用于对视频进行压缩和处理。以下是一个实现示例的详细步骤,包括代码示例和配置说明。 1. FFmpeg 简介 FFmpeg 是一个强大的开源工具,可以用来对音视频进行转换、压缩、剪辑等操作。通过命令行工具或调用其库,你可以高效处理多种格式的视频。 2. 环境准备 安装 FFmpeg …

    2024年11月23日
    00
  • 在github上提交PR(Pull Request) + 多个pr同时提交、互不干扰的方法

    在 GitHub 上提交 PR(Pull Request)是一种将代码变更合并到主分支或其他目标分支的常见方式。在同时处理多个 PR 时,需要使用独立的分支来避免相互干扰。以下是详细教程: 步骤一:单个 PR 的提交流程Fork 仓库如果没有直接访问权限,先 fork 原仓库到自己的 GitHub 帐号。在 fork 的仓库上操作自己的代码。克隆仓库到本地 …

    2024年11月26日
    00
  • 远程仓库 ,从GitHub拉取代码失败的解决办法

    从GitHub拉取代码失败通常由以下几种原因引起:网络问题、认证失败、远程仓库配置错误等。以下是常见的失败场景及解决办法。 1. 网络问题症状连接超时。报错如:fatal: unable to access ‘https://github.com/…’: Failed to connect to github.com port 443: Connecti…

    2024年11月28日
    00
  • 在 Delphi 中创建一个像 C# 那样的 DLL 类库(即面向对象的 DLL)

    在 Delphi 中创建一个像 C# 那样的 DLL 类库(即面向对象的 DLL)可以通过以下步骤实现:1. 创建 Delphi DLL 项目打开 Delphi。选择 File > New > Other > Dynamic-Link Library。在新项目中,默认生成的代码通常是 exports 部分,其中包含了 DLL 导出的函数。2. 定义类你可以在…

    2024年11月29日
    00
  • Python 的 json模块序列化数据从文件里读取出来或存入文件

    Python 的 json 模块用于处理 JSON 格式的数据,可以将 JSON 数据与 Python 数据结构之间相互转换。以下是具体用法,包括从文件读取 JSON 数据以及将数据写入文件: 1. 将 JSON 数据从文件中读取到 Python 数据结构 代码示例: 解析过程: 2. 将 Python 数据结构写入到文件中(序列化为 JSON) 代码示例:…

    2024年11月26日
    00
  • 安卓用微信作为第三方登录,登录授权界面调用

    在 Android 应用中实现微信第三方登录,可以通过调用微信提供的开放平台 SDK 来完成。以下是实现微信登录授权界面的完整步骤: 1. 准备工作 注册微信开放平台应用 下载微信 SDK 2. 项目配置 引入微信 SDK 将 SDK 文件添加到项目的 libs 和 jniLibs 目录下: 在 build.gradle 中添加依赖: 配置权限 在 Andr…

    2024年12月3日
    00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信