屏蔽 trackback/pingback 垃圾评论

上次介绍的方法可以有效阻止通过 wp-comment-post.php 提交的常规垃圾评论,却防不了通过 trackback 发送的垃圾评论。

WordPress 的评论类型comment_type共有三种:

  1. 表示是通过 wp-comment-post.php 提交的常规评论;
  2. trackback 通过 wp-trackback.php 提交,wp-trackback.php 只被 trackback 服务调用,查看 nginx 日志会发现 trackback 来的垃圾评论是直接在目标页面地址后面加上“/trackback” POST 过来的;
  3. pingback 通过 xmlrpc.php 提交,xmlrpc.php 除了被 pingback 调用之外,通过 WordPress APP 访问博客时也需要调用它。

普通方法

这样就好办了,暴力一点的做法可以通过 nginx 配置文件直接禁止对 wp-trackback.php 文件的访问,但 xmlrpc.php 不能随便禁止,因为有其它服务要用到它,下面有个更好的办法可以避免这个问题。

更好的办法

更好的做法是在评论被写入 comment 表前判断评论类型,放过常规评论(阻止常规垃圾评论请见本文开头处的链接,除非人工提交或专门针对规则开发针对性的程序,理论上不会有漏网之鱼),单独对 trackback 和 pingback 类型做处理,得到下面的代码,放入主题的 function.php 文件即可:

if ( ! is_user_logged_in()) {
//block trackback spam comments
function trackback_check($commentdata) {
    extract($commentdata);
    $post_object = get_post($comment->comment_post_ID);
    if ($comment_type == 'trackback' /* if pingbacks || $comment_type == 'pingback' */) {
        wp_die('Trackbacks were disabled!');
    }
    return $commentdata;
}
add_filter('preprocess_comment', 'trackback_check', 1);

上面代码只阻止未登陆用户的 trackback,pingback 以及博客内部的 trackback 则可正常工作,如要同时阻止 pingback,只需把|| $comment_type == 'pingback'加到$comment_type == 'trackback'后面,这样一来即不影响类似 WordPress APP 这种需要调用 xmlrpc.php 来正常工作的服务,又能屏蔽外部的 pingback 了。

改动一下上述代码可将 trackback 垃圾评论的详细内容推送到邮箱,基本上 trackback 来的全是垃圾评论,几乎不存在误杀。

trackback 垃圾评论详情

发表评论

评论(6)

  1. ZE3kr

    pingback和trackback可以直接在WordPress后台,设置、讨论里关闭

    个人觉得pingback挺有用的,之前你那篇文章因为链接到我的网站,就自动发了pingback到我的站点,就被我看到了。我收到的 Pingback 还从没有 SPAM,大概是因为Akismet也会自动检查 Pingback 吧。

      1. Shrek

        @ZE3kr 好像垃圾评论不用 pingback,至少至今尚未遇到,应该没有人为特意过滤html,评论功能是默认设置,贴网址会自动链接。

  2. 姜辰

    加一个打勾验证,打勾验证提交的value值根据日期不断变化即可。

    1. Shrek

      @姜辰 不用☑️不是更好吗

  3. Pingback不用插件屏蔽 WordPress 垃圾评论 – 木瓜园