logo
0
0
WeChat Login

悦·Location — WordPress 评论 IP 归属地插件

版本:1.2.0 · 作者:yefengs · 协议:GPL v2 or later
项目地址:https://cnb.cool/yefengs/yue-location


目录


简介

悦·Location 是一款轻量、纯离线的 WordPress 插件,通过 ip2region 离线数据库实现 IP 归属地查询,并将结果自动展示在评论者昵称旁边。无需调用任何第三方 API,完全本地运行,保护用户隐私,查询延迟极低。

效果示意:

张三   📍 中国 · 广东 · 深圳
评论内容...

John   🌐 United States · California · Los Angeles
Comment content...

功能特性

功能说明
IPv4 / IPv6 自动识别自动判断 IP 版本,分别查询对应数据库,无需手动配置
离线数据库查询基于 ip2region xdb 格式,无需联网,无 API 限制
前台评论自动展示在评论者名称后自动追加归属地,无需修改主题
后台评论归属地列在 WordPress 后台评论列表中新增"IP归属地"列
文章发布者定位记录并展示每篇文章首次发布时的作者 IP 归属地
6 种内置图标定位标记、地图、地球、旗帜、盾牌、指南针 SVG 图标
IPv6 标识徽章IPv6 来源评论自动显示绿色 IPv6 标识
内存向量索引缓存约占用 512 KB 内存,查询速度提升约 10 倍
丰富的主题 API提供 6 个全局函数,供主题开发者灵活调用
自定义 CSS支持自定义样式,也可关闭默认样式自行控制
安全数据清理所有用户提交的数据均经过 sanitize_* 处理

环境要求

项目要求
WordPress≥ 5.0(已在 6.9.4 上测试通过)
PHP≥ 7.4
文件权限插件目录下的 .xdb 文件需要可读(0644 即可)

安装方法

方法一:手动上传(推荐)

  1. 将插件目录(包含以下三个文件)上传至 /wp-content/plugins/yue-location/
    • yue-location.php — 插件主文件
    • ip2region_v4.xdb — IPv4 离线数据库
    • ip2region_v6.xdb — IPv6 离线数据库
  2. 在 WordPress 后台进入 插件 → 已安装的插件,找到「悦·Location」,点击「启用」。
  3. 进入 设置 → 悦·Location 完成配置。

方法二:ZIP 压缩包上传

  1. 将上述三个文件打包为 yue-location.zip
  2. 在后台进入 插件 → 安装插件 → 上传插件,上传 ZIP 包并启用。

注意: 两个 .xdb 数据库文件是必须的。缺少任一文件,对应 IP 版本将无法查询。激活后在 设置 → 悦·Location 顶部可看到数据库状态检查。


文件结构

yue-location/
├── yue-location.php       插件主文件(含核心查询类、主插件类、全局函数)
├── ip2region_v4.xdb       IPv4 离线数据库(ip2region xdb 格式)
├── ip2region_v6.xdb       IPv6 离线数据库(ip2region xdb 格式)
└── README.md              本说明文档

主文件内部结构:

yue-location.php
├── YueLocation_Searcher_Util   工具类(IP解析、字节读取、头部加载)
├── YueLocation_Searcher        xdb 搜索器(支持向量索引缓存、文件流两种模式)
├── Yue_Location                插件主类(WordPress 集成、设置管理、钩子注册)
│   ├── init()                  注册所有 WordPress 钩子
│   ├── query_location()        核心查询方法(返回结构化数组)
│   ├── format_location()       格式化归属地为 HTML 文本
│   ├── filter_comment_author() 前台评论钩子回调
│   ├── save_post_location()    文章发布者定位保存
│   └── render_settings_page() 后台设置页面渲染
└── 全局函数
    ├── Yue_get_location()
    ├── the_Yue_location()
    ├── Yue_get_location_raw()
    ├── Yue_get_location_by_comment()
    ├── Yue_get_post_location()
    └── the_Yue_post_location()

后台设置

进入 WordPress 后台 → 设置 → 悦·Location 进行配置。

基本设置

选项默认值说明
图标风格定位标记(实心)选择归属地前的装饰图标样式,可视化预览选择
归属地前缀文字在归属地信息前追加的文字,例如填写「来自」后显示:来自中国 · 广东 · 深圳
字段分隔符·各归属地字段之间的分隔符,可改为空格、逗号、/

可用图标风格:

标识名称说明
none不显示图标仅显示文字,无图标
pin定位标记(实心)地图定位标记 SVG,默认选项
map地图图标折叠地图 SVG
globe地球图标地球线条 SVG
flag旗帜图标旗帜 SVG
shield盾牌图标盾牌 SVG
compass指南针图标指南针 SVG

归属地显示内容

选择要在归属地信息中展示的字段,至少勾选一个。

选项默认示例值
国家✅ 开启中国、美国、日本
省份✅ 开启广东省、加利福尼亚州
城市✅ 开启深圳市、洛杉矶
ISP / 运营商❌ 关闭电信、联通、移动、阿里云
ISO 国家代码❌ 关闭CN、US、JP
显示 IPv6 标识✅ 开启为 IPv6 评论显示绿色 IPv6 徽章

去重逻辑: 当省份名称与城市名称相同时,插件会自动去重,只显示一个,避免出现"广东 · 广东"等重复情况。


功能开关

开关默认说明
前台评论自动显示✅ 开启在前台所有评论的作者名称后自动追加归属地。关闭后仍可手动调用模板函数
后台评论列表自动显示✅ 开启在后台「评论」列表中新增"IP归属地"列,同时显示完整 IP 地址
文章/页面发布者定位❌ 关闭文章首次发布时自动记录发布者 IP 归属地,写入 post_meta 和文章标签
正文中显示发布者定位✅ 开启开启后在文章正文末尾自动追加发布者归属地标签(依赖上一个开关)

文章发布者定位功能详解:

  • 仅在文章首次发布时查询一次,后续编辑不会修改原始归属地(保留发布时的地点)
  • 归属地数据存入三个 post_meta 字段(见下文
  • 同时以 📍 国家📍 省份📍 城市 格式写入文章标签,支持通过标签归档浏览
  • 仅处理 publish(公开)和 private(私密)状态的 postpage 类型
  • 自动保存(autosave)触发时跳过,避免重复写入

性能与样式

选项默认说明
内存缓存加速✅ 开启加载向量索引到内存(约 512 KB),查询速度提升约 10 倍
默认样式输出到前端页面✅ 开启是否在 <head> 中输出插件内置的 CSS 样式
开启自定义 CSS❌ 关闭开启后,下方文本框中的自定义 CSS 会随页面输出
自定义 CSS自定义样式代码,支持覆盖所有内置 CSS 类

默认样式与自定义 CSS 相互独立,可同时开启、单独开启,或全部关闭由主题接管。


主题开发者 API

所有函数均以 function_exists() 保护声明,即使插件未启用也不会导致主题报错。调用前务必检查函数是否存在。

评论归属地函数


Yue_get_location( $ip )

查询并返回格式化后的归属地 HTML 字符串(含图标、样式类)。

参数类型说明
$ipstringIP 地址字符串,支持 IPv4 和 IPv6

返回值: string — 完整的 HTML 片段,失败返回空字符串。

// 示例
$html = Yue_get_location( '202.96.134.133' );
// 返回:<span class="yue-location"><svg ...></svg>中国 · 广东 · 深圳</span>

the_Yue_location( $ip )

直接 echo 输出归属地 HTML,等同于 echo Yue_get_location( $ip )

the_Yue_location( get_comment_author_IP() );

Yue_get_location_raw( $ip )

查询并返回原始归属地数据数组,适合需要自定义格式化的场景。

返回值: array|null

[
    'country'  => '中国',    // 国家名称
    'province' => '广东省',  // 省份名称
    'city'     => '深圳市',  // 城市名称
    'isp'      => '电信',    // ISP/运营商
    'iso'      => 'CN',      // ISO Alpha-2 国家代码
    'is_v6'    => false,     // 是否为 IPv6 地址
]

Yue_get_location_by_comment( $comment )

根据评论对象或评论 ID 自动提取 IP 并返回格式化的归属地 HTML。

参数类型说明
$commentWP_Comment|int评论对象或评论 ID

返回值: string — 格式化的 HTML,失败返回空字符串。

echo Yue_get_location_by_comment( get_comment() );
echo Yue_get_location_by_comment( 42 ); // 通过评论 ID

文章发布者定位函数


Yue_get_post_location( $post = null )

获取指定文章的发布者归属地 HTML(从 post_meta 缓存读取,无额外查询开销)。

参数类型说明
$postint|WP_Post|null文章 ID 或对象,默认为当前文章($post 全局变量)

返回值: string — 格式化的 HTML,无记录返回空字符串。

echo Yue_get_post_location();       // 当前文章
echo Yue_get_post_location( 123 );  // 指定文章 ID

the_Yue_post_location( $post = null )

直接 echo 输出文章发布者归属地 HTML,等同于 echo Yue_get_post_location( $post )

the_Yue_post_location(); // 在模板中直接输出

post_meta 原始数据

文章首次发布时,插件将以下三个 post_meta 字段写入数据库:

meta_key类型内容
_Yue_location_dataarray完整数据:iplocation(数组)、text(格式化文本)、saved_at(保存时间)
_Yue_location_ipstring发布者 IP 地址
_Yue_location_textstring格式化后的归属地文本(如"中国 · 广东 · 深圳")

以下划线开头的 meta_key 为隐藏字段,不会出现在后台「自定义字段」面板中。


代码示例

示例 1:在评论模板中显示归属地

适用于需要自定义评论位置的场景(关闭自动显示时使用):

<div class="comment-author">
    <?php comment_author(); ?>
    <?php if ( function_exists( 'the_Yue_location' ) ) : ?>
        <?php the_Yue_location( get_comment_author_IP() ); ?>
    <?php endif; ?>
</div>

示例 2:获取原始数据并自定义格式

<?php if ( function_exists( 'Yue_get_location_raw' ) ) : ?>
    <?php
    $loc = Yue_get_location_raw( get_comment_author_IP() );
    if ( $loc ) {
        $parts = array_filter( [
            $loc['country'],
            $loc['province'],
            $loc['city'],
        ] );
        echo '<span class="my-location">' . esc_html( implode( ' · ', $parts ) ) . '</span>';
    }
    ?>
<?php endif; ?>

示例 3:在评论循环中通过评论对象显示

<?php if ( function_exists( 'Yue_get_location_by_comment' ) ) : ?>
    <?php echo Yue_get_location_by_comment( get_comment() ); ?>
<?php endif; ?>

示例 4:在文章 meta 区域显示发布者位置

<div class="entry-meta">
    <span class="posted-on"><?php the_date(); ?></span>
    <span class="comments-link"><?php comments_popup_link(); ?></span>
    <?php if ( function_exists( 'the_Yue_post_location' ) ) : ?>
        <?php the_Yue_post_location(); ?>
    <?php endif; ?>
</div>

示例 5:读取文章 post_meta 原始数据

<?php
// 读取完整预存数据
$data = get_post_meta( get_the_ID(), '_Yue_location_data', true );
if ( $data ) {
    echo '发布 IP:' . esc_html( $data['ip'] );
    echo '国家:'   . esc_html( $data['location']['country'] );
    echo '发布于:' . esc_html( $data['saved_at'] );
}

// 仅读取格式化文本
$text = get_post_meta( get_the_ID(), '_Yue_location_text', true );
if ( $text ) {
    echo '发布于 ' . esc_html( $text );
}
?>

示例 6:查询任意 IP 地址

<?php if ( function_exists( 'Yue_get_location' ) ) : ?>
    <?php
    // 查询当前访问者 IP
    $visitor_ip = $_SERVER['REMOTE_ADDR'];
    echo Yue_get_location( $visitor_ip );

    // 查询指定 IP
    echo Yue_get_location( '8.8.8.8' );
    ?>
<?php endif; ?>

CSS 样式定制

内置 CSS 类名

类名作用
.yue-author-wrapper评论作者名称的外层包裹容器(inline-flex)
.yue-location归属地标签容器(图标 + 文字)
.yue-iconSVG 图标元素(14×14,默认透明度 0.6)
.yue-ipv6-badgeIPv6 标识徽章(绿色圆角标签)
.yue-post-location文章发布者归属地容器
.yue-post-location-meta文章 meta 区域的归属地容器(胶囊样式)
.yue-post-location-label「发布于」文字标签
.yue-post-location-value归属地值的容器

自定义样式示例

在「自定义 CSS」中输入以下代码,可自定义归属地颜色:

/* 修改归属地文字颜色 */
.yue-location {
    color: #888;
    font-size: 0.85em;
}

/* 修改图标颜色 */
.yue-icon {
    color: #c8655e;
    opacity: 0.8;
}

/* 修改 IPv6 徽章样式 */
.yue-ipv6-badge {
    background: #e3f2fd;
    color: #1565c0;
}

/* 文章 meta 归属地样式 */
.yue-post-location-meta {
    background: #fff5f4;
    border-color: #c8655e;
    color: #c8655e;
}

完全自定义(关闭默认样式)

  1. 在「性能与样式」中关闭「默认样式输出到前端页面」
  2. 在主题 CSS 中自行为上述类名编写样式

数据格式说明

ip2region 数据库返回的原始格式为:

国家|省份|城市|ISP|ISO-Alpha2代码

示例:

原始字符串国家省份城市ISPISO
中国|广东省|深圳市|电信|CN中国广东省深圳市电信CN
美国|加利福尼亚州|洛杉矶|Google|US美国加利福尼亚州洛杉矶GoogleUS
中国|0|0|联通|CN中国联通CN

当某字段数据为 0 时,代表该数据库中无此字段记录。插件会自动过滤值为 0 的字段,不参与显示。


工作原理

查询流程

用户访问页面
    │
    ├─ 前台评论显示
    │   └─ get_comment_author 过滤器触发
    │       └─ 读取评论 IP → 自动判断 IPv4/v6
    │           └─ 加载对应 .xdb 数据库(向量索引缓存)
    │               └─ 二分查找定位 → 解析归属地字段
    │                   └─ 按配置格式化 → 输出 HTML
    │
    └─ 文章发布者定位
        └─ save_post 钩子触发(首次发布时)
            └─ 获取发布者 IP
                └─ 查询归属地 → 写入 post_meta
                    └─ 写入文章标签(📍前缀)
                        └─ 前台读取 post_meta 缓存展示

缓存策略

插件提供两种查询模式,由「内存缓存加速」开关控制:

模式内存占用磁盘 IO说明
向量索引缓存(推荐)~512 KB少量将向量索引层加载到内存,大幅减少随机 IO
文件读取模式极少较多每次查询直接 fseek+fread,适合内存极度紧张的环境

注意事项

  1. 两个 .xdb 文件缺一不可ip2region_v4.xdb 用于 IPv4 查询,ip2region_v6.xdb 用于 IPv6 查询。激活后请在后台设置页确认数据库状态为「✓ 正常」。

  2. 文件权限:确保 Web 服务器用户(如 www-data)对两个 .xdb 文件有读取权限(chmod 644)。

  3. 主题调用安全:在主题模板中调用插件函数时,务必使用 function_exists() 判断,防止插件未启用时主题报错:

    if ( function_exists( 'the_Yue_location' ) ) {
        the_Yue_location( get_comment_author_IP() );
    }
    
  4. 建议使用子主题:修改主题模板文件前,请先备份,建议在子主题中进行定制。

  5. 归属地精度:数据精度取决于 ip2region 数据库的收录情况,部分 IP 段可能仅有国家或省份信息,城市字段为空属正常现象。

  6. IPv6 支持:IPv6 归属地数据覆盖范围相对 IPv4 略少,部分 IPv6 地址可能仅返回国家信息。

  7. 反向代理环境:如站点使用了 Nginx 反向代理或 CDN,评论者 IP 可能为代理服务器 IP,建议在服务器配置中正确透传 X-Forwarded-For 头。文章发布者 IP 获取顺序为:HTTP_X_FORWARDED_FORHTTP_CLIENT_IPREMOTE_ADDR


常见问题

Q:激活后后台提示数据库文件缺失怎么办?
A:请确认插件目录下存在 ip2region_v4.xdbip2region_v6.xdb 两个文件,且服务器用户有读取权限。可通过 FTP 或 SSH 重新上传。

Q:前台评论没有显示归属地?
A:检查以下几点:① 后台「功能开关」中「前台评论自动显示」是否开启;② 数据库文件是否正常;③ 主题的评论模板是否使用了 get_comment_author 过滤器(部分主题可能绕过此过滤器)。

Q:主题评论模板不走 get_comment_author 过滤器怎么办?
A:关闭自动显示,改为在主题模板中手动调用 the_Yue_location( get_comment_author_IP() ) 函数。

Q:文章发布者定位功能开启后没有显示归属地?
A:该功能仅在文章首次发布时记录。如果文章已经发布过,需要删除对应的 _Yue_location_data post_meta 记录后重新发布,或手动写入数据。

Q:归属地显示"未知"?
A:表示该 IP 在数据库中未查到有效记录,或查到的所有字段均为 0。这是数据库覆盖率问题,属正常现象。

Q:可以同时在前台显示和后台评论列表显示吗?
A:可以,两个开关相互独立,可同时开启。


更新日志

v1.2.0

  • 新增「文章/页面发布者定位」功能
  • 新增「正文中显示发布者定位」子开关
  • 新增「默认样式输出」与「自定义 CSS」独立控制
  • 新增后台设置页实时预览区域(IPv4 / IPv6 / 国外 IP 三组预览)
  • 新增「开启自定义 CSS」独立开关
  • 优化搜索器缓存机制,防止重复初始化
  • 完善后台使用说明文档区域
  • 新增 Yue_get_post_location()the_Yue_post_location() 全局函数

许可证

本插件以 GPL v2 or later 协议发布。

IP 归属地数据来源:ip2region — 开源离线 IP 归属地查询库,协议为 Apache 2.0。

About

一款Wordpress IP归属地展示插件,可展示评论和博文作者IP的归属地,支持IPv4和IPv6地址。

Language
PHP100%