WordPress 非插件实现评论回复邮件通知

当访客在博客上留下评论后,说不定就忘了这条评论甚至是这个博客。为了吸引评论互动,我们通常都给博客添加“实现评论回复邮件通知”的功能。我在这里介绍一个不用插件就实现的办法。

这个版本有如下优点:

 1.所有內置嵌套模板都适用,不需要额外的 Ajax comments;

 2.即使是在后台回复也可自动发送邮件;

 3.免插件,减少“负担”。

有三种方式,选择适合自己的一种添加到 functions.php 的 <?php 后面——

有勾选框,由访客决定是否要回复邮件通知:

(提示:这样会在主题上自动加勾选框,如果不想,可把后面一小段删除)

/* comment_mail_notify v1.0 by willin kan. (有勾选栏, 由访客決定) /
function comment_mail_notify($comment_id) {
    $admin_notify = '1'; // admin管理员 要不要接收回复通知 ( '1'=要 ; '0'=不要 )
    $admin_email = get_bloginfo ('admin_email'); // $admin_email 可改为你指定的 e-mail.
    $comment = get_comment($comment_id);
    $comment_author_email = trim($comment->comment_author_email);
    $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
    global $wpdb;
    if ($wpdb->query("Describe {$wpdb->comments} comment_mail_notify") == '')
        $wpdb->query("ALTER TABLE {$wpdb->comments} ADD COLUMN comment_mail_notify TINYINT NOT NULL DEFAULT 0;");
    if (($comment_author_email != $admin_email && isset($_POST['comment_mail_notify'])) || ($comment_author_email == $admin_email && $admin_notify == '1'))
        $wpdb->query("UPDATE {$wpdb->comments} SET comment_mail_notify='1' WHERE comment_ID='$comment_id'");
    $notify = $parent_id ? get_comment($parent_id)->comment_mail_notify : '0';
    $spam_confirmed = $comment->comment_approved;
    if ($parent_id != '' && $spam_confirmed != 'spam' && $notify == '1') {
        $wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 發出點, no-reply 可改为可用的 e-mail.
        $to = trim(get_comment($parent_id)->comment_author_email);
        $subject = '您在 [' . get_option("blogname") . '] 的评论有了回复';
        $message = '
        <div style="background-color:#eef2fa; border:1px solid #d8e3e8; color:#111; padding:0 15px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px; border-radius:5px;">
            <p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
            <p>您曾在《' . get_the_title($comment->comment_post_ID) . '》的评论: <br />'
             . nl2br(get_comment($parent_id)->comment_content) . '</p>
            <p>' . trim($comment->comment_author) . ' 给您的回复:<br />'
             . nl2br($comment->comment_content) . '<br /></p>
            <p>您可以点击 <a href="' . htmlspecialchars(get_comment_link($parent_id)) . '">查看完整内容</a></p>
            <p>欢迎再次光临 <a href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>
            <p>(此邮件由系统自动发出, 请勿回复.)</p>
        </div>';
        $from = "From: \"" . get_option('blogname') . "\" <$wp_email>";
        $headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
        wp_mail( $to, $subject, $message, $headers );
        //echo 'mail to ', $to, '<br/> ' , $subject, $message; // for testing
    }
}
add_action('comment_post', 'comment_mail_notify');

/ 自動加勾選欄 不想要的下面的连同这行去掉*/
function add_checkbox() {
    echo '<input type="checkbox" name="comment_mail_notify" id="comment_mail_notify" value="comment_mail_notify" checked="checked" style="margin-left:20px;" /><label for="comment_mail_notify">有人回复时邮件通知我</label>';
}
add_action('comment_form', 'add_checkbox');

// -- END ----------------------------------------

没有勾选框,由管理员决定什么条件下发邮件:

/* comment_mail_notify v1.0 by willin kan. (無勾選欄) /
function comment_mail_notify($comment_id) {
    $admin_email = get_bloginfo ('admin_email'); // $admin_email 可改為你指定的 e-mail.
    $comment = get_comment($comment_id);
    $comment_author_email = trim($comment->comment_author_email);
    $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
    $to = $parent_id ? trim(get_comment($parent_id)->comment_author_email) : '';
    $spam_confirmed = $comment->comment_approved;
    if (($parent_id != '') && ($spam_confirmed != 'spam') && ($to != $admin_email) && ($comment_author_email == $admin_email)) {
        / 上面的判斷式,決定發出郵件的必要條件:
        ($parent_id != '') && ($spam_confirmed != 'spam'): 回覆的, 而且不是 spam 才可發, 必需!!
        ($to != $admin_email) : 不發給 admin.
        ($comment_author_email == $admin_email) : 只有 admin 的回覆才可發.
        可視個人需求修改以上條件.
        */
        $wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 發出點, no-reply 可改為可用的 e-mail.
        $subject = '您在 [' . get_option("blogname") . '] 的评论有了回复';
        $message = '
        <div style="background-color:#eef2fa; border:1px solid #d8e3e8; color:#111; padding:0 15px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px; border-radius:5px;">
            <p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
            <p>您曾在《' . get_the_title($comment->comment_post_ID) . '》的评论:<br />'
             . nl2br(get_comment($parent_id)->comment_content) . '</p>
            <p>' . trim($comment->comment_author) . ' 给您的回复:<br />'
             . nl2br($comment->comment_content) . '<br /></p>
            <p>您可以点击 <a href="' . htmlspecialchars(get_comment_link($parent_id)) . '">查看完整內容</a></p>
            <p>欢迎再次光临 <a href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>
            <p>(此邮件由系统自动发出, 请勿回复.)</p>
        </div>';
        $from = "From: \"" . get_option('blogname') . "\" <$wp_email>";
        $headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
        wp_mail( $to, $subject, $message, $headers );
        //echo 'mail to ', $to, '<br/> ' , $subject, $message; // for testing
    }
}
add_action('comment_post', 'comment_mail_notify');
// -- END ----------------------------------------

所有回复都发邮件

/* comment_mail_notify v1.0 by willin kan. (所有回覆都發郵件) */
function comment_mail_notify($comment_id) {
    $comment = get_comment($comment_id);
    $parent_id = $comment->comment_parent ? $comment->comment_parent : '';
    $spam_confirmed = $comment->comment_approved;
    if (($parent_id != '') && ($spam_confirmed != 'spam')) {
        $wp_email = 'no-reply@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); //e-mail 發出點, no-reply 可改為可用的 e-mail.
        $to = trim(get_comment($parent_id)->comment_author_email);
        $subject = '您在 [' . get_option("blogname") . '] 的评论有了新的回复!';
        $message = '
        <div style="background-color:#eef2fa; border:1px solid #d8e3e8; color:#111; padding:0 15px; -moz-border-radius:5px; -webkit-border-radius:5px; -khtml-border-radius:5px; border-radius:5px;">
            <p>' . trim(get_comment($parent_id)->comment_author) . ', 您好!</p>
            <p>您曾在《' . get_the_title($comment->comment_post_ID) . '》的评论:<br />'
             . nl2br(get_comment($parent_id)->comment_content) . '</p>
            <p>' . trim($comment->comment_author) . ' 给您的回复:<br />'
             . nl2br($comment->comment_content) . '<br /></p>
            <p>您可以点击 <a href="' . htmlspecialchars(get_comment_link($parent_id)) . '">查看完整內容</a></p>
            <p>欢迎再次光临 <a href="' . get_option('home') . '">' . get_option('blogname') . '</a></p>
            <p>(此邮件由系统自动发出, 请勿回复.)</p>
        </div>';
        $from = "From: \"" . get_option('blogname') . "\" <$wp_email>";
        $headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";
        wp_mail( $to, $subject, $message, $headers );
        //echo 'mail to ', $to, '<br/> ' , $subject, $message; // for testing
    }
}
add_action('comment_post', 'comment_mail_notify');
// -- END ----------------------------------------

加入的参数是让它选取 comment 数量计算就好.

评论样式有使用 comments 和 trackbacks/pingbacks 分离的童鞋, 请进行修改. 没用到的就不能改.

文外话:WordPress 真的飞不起来?

是的,这些代码出自 Willin Kan 之手。他的博客已经关闭了,文章也被删除了。他只留了一篇文章,并且他说:

或许有人会告诉你:“WordPress 是最好的博客程序!”…是的,不过那已是以前的事了。

此篇文章系从快照里翻出,修改后发表在本博,以作纪念。

若无特别说明,本文系原创,遵循 署名-非商业性使用 3.0 (CC BY-NC 3.0) 协议,转载文章请注明来自【闪星空间】,或链接上原文地址:http://shansing.com/read/116/

40 条评论

  1. wordpress will certainly come to destruction ,

    1. Every blog-program also does.

      1. No, I'm optimistic about the Emlog

        1. Typecho is nice,too.

          1. but typecho has not been updated for a long time

            1. The Cabbages and the Radishes all have their loves.

            2. In fact, I do not want to continue to study WordPress As WillingKan

            3. 我们说中文好不?听说emlog支持了很多php4的旧函数,所以不能完全算轻量或简洁呀。

            4. 这个是肯定的,Emlog在处理兼容性的问题上一直有很多问题,比如说现在的最新版本竟然没有抛弃IE6,被弄的很纠结,Typecho在这方面做的灰常不错,超轻量级

            5. 是的,但是emlog有很多的模板,这点上比typecho好。

            6. 其实现在Typecho和EMlog都有用,不过还是Emlog用的比较多,Typecho都是用来折腾的

            7. 我其实想转到 Typecho 了,但是那样需要做许多事,我懒。

            8. 就这样安于现状呗。。有时间慢慢折腾下。。

            9. 是的,等我技术成熟些就把这主题移植去。

  2. 这个我看到过含多个版本,嘿嘿

  3. 不知道可否和你换一个首页链接?嘿嘿

  4. Ben Ben

    后面那段话总觉得有点伤感...

  5. 不懂代码的路过

    1. 不介意的话,插件其实也是可以的。

  6. Ben Ben

    我现在计划搬到EMLOG去了...

    1. 据我所知,你又放弃了。

  7. Ben Ben

    。。怎么手机版没回复按钮。。。那我直接发好了
    WP搬到EM评论导不过去,也没办法搬。。所以计划取消

    1. 因为手机版木有嵌套……但是转到Typecho是可以的,我准备这两天就过去。

      1. Ben Ben

        我找到回复链接了。。是一个空格。。
        真的么?那我去折腾折腾。。

        1. 囧,那我肿么找不到回复按钮。

  8. Ben Ben

    嘿嘿,我来围观了

  9. 很详细

  10. 可以测试一下效果吗

    1. 这个回复就是为了测试的!

    2. 原来贵博客,没有这个功能!

      1. 呵呵,其实是有的。不过自己回复自己是无效的!

        1. 我是指我现在的设置,因为我的博客已不再使用 WordPress,取而代之的是 Typecho。

发表评论»

NO SPAMS! 不要发垃圾评论哦!

表情