评论显示 IP 属地有两种实现方式:一种是手动放文件、改主题代码,另一种是装一个开源插件。两种都能跑通,这里把思路都记一遍。
一、文件版
准备好 show-useragent 这个目录,把它整个上传到主题目录里解压,然后把该目录复制一份粘贴到网站根目录。
![图片[1]-主题添加评论IP属地功能-本站](https://blog.azhai.de/wp-content/uploads/3f4b59e367002044.png)
接着把下面两行 include 放进主题的 func.php(用 func.php 是为了更新主题时不被覆盖),分别负责访客信息展示和 IP 归属地/运营商查询:
include("show-useragent/show-useragent.php"); // 显示访客信息
include("show-useragent/ip2c-text.php"); // IP归属地和运营商查询功能
然后是评论列表模板。多数主题里对应的文件是 comments-list,找到拼接评论者名字的那段,改成下面这样,用 convertip 取到归属地再塞进一个 span:
$ip = convertip(get_comment_author_ip());
return '<name class="flex ac flex1">' . $user_name . $badge .'<span class="badg badge badg-sm flex0 ml3">'.$ip.'</span>'.'</name>';
![图片[2]-主题添加评论IP属地功能-本站](https://blog.azhai.de/wp-content/uploads/a6c2019de1002246.png)
如果还想在评论里显示浏览器/系统这类 UA 信息,可以再加上下面这段(UA 展示样式一般比较占地方,不需要就跳过):
$diqu = CID_get_comment_browser();
$diqu .= CID_print_comment_flag();
$time_html = '<span class="comt-author"' . ($is_mobile ? ' data-toggle="tooltip"' : '') . ' title="' . date('Y年m月d日 H:i:s', strtotime($comment->comment_date)) . '">' . zib_get_time_ago($comment->comment_date) . '</span>'.'<span class="comt-author" title="">'.$diqu.'</span>';
![图片[3]-主题添加评论IP属地功能-本站](https://blog.azhai.de/wp-content/uploads/751b76c7d8002447.png)
刷新页面即可看到效果。
二、插件版
插件版用的是一套开源的归属地插件,思路跟文件版差不多。先在后台上传并启用插件。
![图片[4]-主题添加评论IP属地功能-本站](https://blog.azhai.de/wp-content/uploads/064d648b47002535.webp)
再改评论列表模板,位置跟文件版一样,只是取归属地的函数换成了插件提供的:
![图片[5]-主题添加评论IP属地功能-本站](https://blog.azhai.de/wp-content/uploads/c6cb8a6b72002623.webp)
$ip_loction = easy_location_handle_comment($comment_text);
return '<name class="flex ac flex1">' . $user_name . $badge .'<span class="badg badge badg-sm flex0 ml3">'.$ip_loction.'</span>'.'</name>';
到这一步就能用了。插件主文件里有一个常量 define(‘SHOW_POST_LOCATION’, false);,把 false 改成 true,还能顺带显示文章作者的 IP 归属地。
![图片[6]-主题添加评论IP属地功能-本站](https://blog.azhai.de/wp-content/uploads/af5d6c0fa8002807.webp)
三、自定义显示位置
开启文章归属地后,默认会拼接在正文底部。想换个位置,可以在主题里取用户信息的那段代码中,找一个空行插入下面这行拿到归属地变量:
$post_up_ip = easy_location_handle_post_content($content);
再在同文件稍下方的输出语句里把它带出来,注意单引号中间那个空格别删掉,否则会和前面的文字连在一起:
$html .= $desc . ' ' . $post_up_ip;
改完之后,正文底部那段默认输出就多余了。回到插件主文件,把拼接 easy_location_handle_post_content 的那整个函数替换成下面的写法,改用自定义的图标 class:
if (!function_exists('easy_location_handle_post_content')) :
function easy_location_handle_post_content($content)
{
global $post;
if (get_post_meta($post->ID, 'easy_location_ip', true) && SHOW_POST_LOCATION) {
$content .= '<span class="up-ippppp"><svg t="1662544287744" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5853"><path d="M897.5 423.7c0-161.7-96.7-300.9-235.4-362.7-0.7-0.3-1.4-0.6-2.2-1-1.4-0.6-2.8-1.2-4.3-1.8-48-20.5-100.7-31.8-156.2-31.8-219.8 0-398.1 178.2-398.1 398.1 0 97 34.7 185.8 92.3 254.9 0.9 1.2 1.8 2.4 2.8 3.5l1.1 1.2c2 2.3 3.9 4.5 6 6.8l0.1-0.1 263.6 288.3c2.9 3.2 6.3 5.8 9.9 7.9 16.5 11.1 39.1 8.7 53-6.4L787 699.5l0.1 0.1c5.2-5.4 10.3-11 15.2-16.8l0.1-0.1c0.7-0.7 1.3-1.5 1.9-2.3 58.2-69.2 93.3-158.6 93.3-256.1v-0.3c-0.1-0.1-0.1-0.2-0.1-0.3z" fill="#707070" p-id="5854"></path><path d="M499.5 264.4c-88.6 0-160.5 71.9-160.5 160.5s71.9 160.5 160.5 160.5S660 513.5 660 424.9s-71.9-160.5-160.5-160.5z" fill="#FFFFFF" p-id="5855"></path></svg>来自' . get_user_city(get_post_meta($post->ID, 'easy_location_ip', true)) . '</span>';
}
return $content;
}
endif;
如果不想在正文里显示这段,加一条 CSS 把它藏起来就行:
.theme-box.wp-posts-content span.up-ippppp {
display: none;
}
四、常见问题
评论 IP 不准:多半是套了 CDN,真实 IP 被转发头盖住了。在 wp-config.php 的 <?php 下面加上取真实 IP 的代码即可:
//获取访客真实IP地址
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];
};
只显示省份不显示城市:在插件的 PHP 文件里找到取归属地那个函数,把下标 [1] 改成 [2]。改成 2 之后,少数拿不到城市信息的评论可能会不显示归属地,可以换成带回退的写法:
if (!function_exists('get_user_city')) :
function get_user_city($ip)
{
$reader = new Reader(__DIR__ . '/ipipfree.ipdb');
try {
if($reader->find($ip)[2])
return $reader->find($ip) ? $reader->find($ip)[2] : false;
else
return $reader->find($ip) ? $reader->find($ip)[1] : false;
} catch (Throwable $th) {
return false;
}
}
endif;
文章底部只剩“来自”两个字:还是打开插件 PHP 文件,找到写 onlineip 那一行,整行换成下面这句:
update_post_meta($post_id, 'easy_location_ip', explode(',', $onlineip)[0]);
![图片[7]-主题添加评论IP属地功能-本站](https://blog.azhai.de/wp-content/uploads/1e20d6622d003053.png)

















暂无评论内容