wordpress

《WordPress评论从畅言到原生》

上一篇文章中,我提到了畅言的种种槽点
并且还逐渐出现了各种垃圾评论
不堪忍受的我最终一怒决定回到原生

修补畅言留下的坑

删掉畅言后,会发现以前通过畅言回复的一些评论的层级关系丢失
意思就是我原本回复另一条评论的评论,在删掉畅言后变成了一条独立的评论
还好这只是部分发生。进入数据库wp_comments表,修改comment_parent字段即可修复回复关系

然后是出现重复评论的问题,也是部分发生,情况类似

第一条发表于畅言安装时,第二条是好几年前用户发的
同步就同步吧,还搞出了重复的玩意儿,而且还丢失了信息
打算写个脚本解决这个问题,先不管了

20170411:脚本已完成,详见修复卸载畅言后出现随机重复评论的脚本

其次是回复者id问题。如果是博客用户进行评论的话,则user_id字段不为0
在一些主题下(例如我在用的这个Minty),管理员发表的评论上会出现特殊身份标记

鉴于很多个人博客并不开放注册(例如我),那么这个字段的值就只会是0或1
虽然我是博主,但通过畅言的评论并不会标记我的博主身份,即user_id=0,也就没有了上图中的特殊标记
所以需要执行一段SQL进行修复。例如我就执行了:

UPDATE `wp_comments` SET `user_id`=1 WHERE `comment_author_email` = 'i@mokeyjay.com'

如果你也要这么做,还得考虑你的实际情况。例如可能会有其他人用了你邮箱?或者你的管理员id不是1之类的

小部件 – 最新评论

第三方评论往往自带最新评论小部件,放在侧边栏不错
干掉了第三方,最新评论功能咋办?
……
我也不知道咋办哈哈哈哈哈!
我的主题Minty自带此小部件,我直接用上了

新评论邮件通知

WordPress是自带新评论邮件通知的,但要用上它,一般需要做两件事
一是到后台设置讨论发送电子邮件通知我里面勾上它
二是到插件管理安装一款SMTP邮件插件,例如我在用的WP-Mail-SMTP
为什么要装个插件呢?因为很多服务器都会屏蔽PHP的mail()函数或者25端口
因此就需要SMTP插件来重写wp_mail()函数以正常发送邮件
随便注册个国内邮箱,开通SMTP服务,然后把相关参数填进插件,保存,搞定
每当你的文章有新的评论时,wordpress就会用这个邮箱向你的邮箱发送通知邮件

评论被回复邮件通知

这是Wordpress没有自带的功能,需要我们自己实现
虽然也有几个能够实现这个功能的插件,但我试了下都已经无法使用或太过臃肿了
要发出邮件,首先要安装上面说的SMTP插件。然后就是在评论提交的地方挂个钩,触发邮件发送
具体我是参照这篇文章:WordPress 评论回复邮件通知 优化

/**
 * 修复 WordPress 邮件评论回复通知被恶意利用的问题 logcg.com 落格博客
 */
function logcg_comment_mail_notify($comment_id, $comment_status) {
  // 评论必须经过审核才会发送通知邮件
  if ($comment_status !== 'approve' && $comment_status !== 1)
    return;

  $comment = get_comment($comment_id);

  if ($comment->comment_parent != '0') {
    $parent_comment = get_comment($comment->comment_parent);

    // 邮件接收者email      
    $to = trim($parent_comment->comment_author_email);

    // 邮件标题
    $subject = '您在[' . get_option("blogname") . ']的留言有了新的回复';

    // 邮件内容,自行修改,支持HTML
    $message = '
      <div style="background-color:#fff; border:1px solid #666666; color:#111; 
-moz-border-radius:8px; -webkit-border-radius:8px; -khtml-border-radius:8px; 
border-radius:8px; font-size:12px; width:702px; margin:0 auto; margin-top:10px; 
font-family:苹方,微软雅黑, Arial;">  
<div style="background:#666666; width:100%; height:60px; color:white; 
-moz-border-radius:6px 6px 0 0; -webkit-border-radius:6px 6px 0 0; 
-khtml-border-radius:6px 6px 0 0; border-radius:6px 6px 0 0; ">  
<span style="height:60px; line-height:60px; margin-left:30px; font-size:12px;">  
您在 <a style="text-decoration:none; color:#00bbff;font-weight:600;"  
href="' . get_option('home') . '">' . get_option('blogname') . '  
</a> 的留言有了新回复!</span></div>  
<div style="width:90%; margin:0 auto">  
' . $parent_comment->comment_author . ',您好!</p>  
<p>您曾在 [' . get_option("blogname") . '] 的文章  
《' . get_the_title($comment->comment_post_ID) . '》 上发表评论:  
<p style="background-color: #EEE;border: 1px solid #DDD; 
padding: 20px;margin: 15px 0;">' . nl2br($parent_comment->comment_content) . '</p>  
<p>' . trim($comment->comment_author) . ' 给您的回复如下:  
<p style="background-color: #EEE;border: 1px solid #DDD;padding: 20px; 
margin: 15px 0;">' . nl2br($comment->comment_content) . '</p>  
<p>您也可移步 <a style="text-decoration:none; color:#00bbff"  
href="' . htmlspecialchars(get_comment_link($comment->comment_parent)) . '">落格博客</a> 以查看回复的完整內容。</p>  
<p>欢迎再次光临 <a style="text-decoration:none; color:#00bbff"  
href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>  
<p>(此邮件由系统自动发出, 请勿回复。)</p>  
</div>
</div>';

    $message_headers = "Content-Type: text/html; charset=\"".get_option('blog_charset')."\"\n";

    // 不用给不填email的评论者和管理员发提醒邮件
    if($to != '' && $to != get_bloginfo('admin_email'))
      @wp_mail($to, $subject, $message, $message_headers);
  }
}


// 编辑和管理员的回复直接发送提醒邮件,因为编辑和管理员的评论不需要审核
add_action('comment_post', 'logcg_comment_mail_notify', 20, 2);

// 普通访客发表的评论,等博主审核后再发送提醒邮件
add_action('wp_set_comment_status', 'logcg_comment_mail_notify', 20, 2);

不过我觉得这邮件样式不好看,于是跑去友链里抄了夜绫千裕
顺手改了下,给通知邮件里的文章标题加上了链接,感觉更方便些
想知道长啥样?在下方评论一个即可

解决通知邮件泄露服务器真实IP的问题

邮件原文里是能够看到发信服务器的IP地址的(SMTP也一样),这是个隐患
以前为了开源项目贴吧云签到到处喷版权狗时,博客经常被打
虽说规模不大,免费的DDOS防护基本够用,但还影响访问还是挺烦的不是?
虽然这几年已经没再出现了,但小心点总是没错的。尽可能还是不要泄露服务器的IP吧
既然没法在本机上发信了,那就只能找那些商业邮件代发服务了
简单搜了下,国内比较出名的是SendCloud,每日免费200封;国外比较出名的是mailgun,每月免费1w封
听起来是不是后面这个很美好?然而不少网友都说mailgun发出的邮件会被QQ邮箱花式拒收
我个人博客这么小的体量,肯定是轮不到我来和QQ邮箱部门协商解决的,那就只能选择前者了
简单注册后,绑定域名(强烈推荐绑个三级域名即可),做几个简单的小任务即可获得200/日的免费额度
然后调用他们提供的接口来发邮件即可实现隐藏真实IP的效果啦~

顺道一提,SendCloud的API_USER必须是全系统唯一的,而不仅仅是在你的域名下唯一
我一开始想弄个no_reply,被告知已存在,一脸懵逼,我这除了一个默认生成的测试USER以外就啥也没有了啊?
也许是保留关键字?那我换个blog_notice,依然报错已存在
最后发了工单才知道原来这个API_USER必须是全系统唯一的,我填了个mokeyjay_blog_notice才算成功

再顺道一提,如果你也被SendCloud的模板邮件接口的substitution_vars坑到了,请直接拉到最下面看我的代码

(全文完)

附录

鉴于很可能有人会问,我就把我的邮件模板和修改后的通知代码放出来吧,方便下大家
也希望受到帮助的人能够留言以示谢意

SendCloud邮件模板

<span id="9999" style="display: none !important; font-size:0; line-height:0">你在 超能小紫 博客上的留言有回复啦</span>

<div style="background-color:white;border-top:2px solid #12ADDB;box-shadow:0 1px 3px #AAAAAA; line-height:180%; padding:0 15px 12px;width:500px;margin:100px auto;color:#555555;font-family:Century Gothic,Trebuchet MS,Hiragino Sans GB,微软雅黑,Microsoft Yahei,Tahoma,Helvetica,Arial,SimSun,sans-serif;font-size:14px;">
<h2 style="border-bottom:1px solid #DDD;font-size:16px;font-weight:normal;padding:13px 0 10px 0;"><span style="color: #12ADDB;font-weight: bold;">&gt; </span>你在 <a href="https://www.mokeyjay.com" style="text-decoration:none;color: #12ADDB;" target="_blank">超能小紫</a> 博客上的留言有回复啦!</h2>

<div style="padding:0 12px 0 12px;margin-top:18px">
%you% 同学,你在文章《<a href="%post_url%" style="text-decoration:none; color:#12addb" target="_blank">%post%</a>》上的评论:

<p style="background-color: #f5f5f5;border: 0 solid #DDD;padding: 10px 15px;margin:18px 0">%you_comment%</p>

%comment_author% 给你的回复如下:

<p style="background-color: #f5f5f5;border: 0 solid #DDD;padding: 10px 15px;margin:18px 0">%comment%</p>

你可以点击 <a href="%comment_url%" style="text-decoration:none; color:#12addb" target="_blank">查看回复的完整內容 </a>,欢迎再来玩呀~
</div>
</div>

评论被回复邮件通知

function mokeyjay_comment_mail_notice($comment_id, $comment_status)
{
    // 评论必须经过审核才会发送通知邮件
    if ($comment_status !== 'approve' && $comment_status !== 1) return;

    $comment = get_comment($comment_id);

    if ($comment->comment_parent != '0'){
        $parent_comment = get_comment($comment->comment_parent);

        // 邮件接收者email
        $to = trim($parent_comment->comment_author_email);
        // 没填邮箱或被回复者为管理员则不发邮件
        if ($to != '' && $to != get_bloginfo('admin_email')){
            // SendCloud接口参数
            $data = [
                'api_user'             => '你的API_USER',
                'api_key'              => '你的API_KEY',
                'from'                 => '发件人邮箱', // 基于你绑定的域名,例如我是 no-reply@notice.mokeyjay.com
                'fromname'             => '发件人名称', // 例如我是 超能小紫 - 评论通知
                'template_invoke_name' => '你的模板调用名称',
                'substitution_vars'    => json_encode([
                    'to'  => [$to],
                    'sub' => [
                        '%you%'            => [$parent_comment->comment_author],
                        '%post_url%'       => [get_permalink($comment->comment_post_ID)],
                        '%post%'           => [get_the_title($comment->comment_post_ID)],
                        '%you_comment%'    => [$parent_comment->comment_content],
                        '%comment_author%' => [$comment->comment_author],
                        '%comment%'        => [$comment->comment_content],
                        '%comment_url%'    => [get_comment_link($comment->comment_parent)],
                    ],
                ]),
            ];
            // 调用接口
            $ch = curl_init('http://sendcloud.sohu.com/webapi/mail.send_template.json');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($ch, CURLOPT_POST, TRUE);
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
            curl_exec($ch);
        }
    }
}


// 编辑和管理员的回复直接发送提醒邮件,因为编辑和管理员的评论不需要审核
add_action('comment_post', 'mokeyjay_comment_mail_notice', 20, 2);

// 普通访客发表的评论,等博主审核后再发送提醒邮件
add_action('wp_set_comment_status', 'mokeyjay_comment_mail_notice', 20, 2);

17 条评论

昵称
  1. LOHMO

    N年前注册的Google App Engine派上用场了,花了30RMB找人改了主域名就可以愉悦的享用了

  2. 对对对

    对对对

  3. 小白龙

    我把畅言评论插件删了之后,系统自带的评论框没显示咋办?

    1. mokeyjay

      后台-设置-讨论-允许他人在新文章上发表评论

  4. MikuSama

    今天才用上~感谢

  5. 后知后觉

    submail每天500封免费 进垃圾箱的次数一般 阿里的完全不行 基本都在垃圾箱里 sendcloud很好就是太贵了

    1. mokeyjay

      感谢,已收藏,以后有需要就转过去