前言
这两天发现,如果未登录用户(游客)留下评论后,如果被其它人回复,Ta 是无法收到邮件通知的。一开始我还以为是主题的问题,后来网上搜索发现这是 WordPress 的特性。
预期行为
未登录的游客 A 在文章留下了评论,并被其他人回复,此时系统应当根据游客 A 评论时填写的邮件地址,向其发送邮件通知。
开始实践
网上相关的教程实在有点少,或者说几乎没有,寻来觅去,终于找到龙笑天下大佬 2016 年的一篇文章 讲过类似的问题,将代码稍作修改正好能符合我的需求。
直接上代码:
//访客评论邮件回复
function comment_mail_notify($comment_id) {
$admin_notify = '1'; // 管理员是否接收回复通知 ( '1'=要 ; '0'=不要 )
$admin_email = get_bloginfo ('admin_email'); // $admin_email 默认从wordpress获取,也可改为你指定的邮箱
$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 = 'blog@' . preg_replace('#^www.#', '', strtolower($_SERVER['SERVER_NAME'])); // e-mail 发出点,需自行修改
$to = trim(get_comment($parent_id)->comment_author_email);
$subject = '您的评论收到了一条回复';
$message = '尊敬的用户:<br>';
$message .= '您在<a href="' . htmlspecialchars(get_comment_link($parent_id)) . '">' . get_the_title($comment->comment_post_ID) . '</a>的评论收到了一条回复:' . '<br>';
$message .= '<br>您留下的评论:' . '<br>';
$message .= '<div class="muted-box" style="padding: 10px 15px; border-radius: 8px; color: #5f5f5f; background: rgba(141, 141, 141, 0.05);">' . nl2br(get_comment($parent_id)->comment_content) . '</div>';
//$message .= '<br>评论于:' . $parent_comment->comment_date . '<br>';
$message .= '<br>' . trim($comment->comment_author) . ' 回复了您:' . '<br>';
$message .= '<br><div class="muted-box" style="padding: 10px 15px; border-radius: 8px; color: #5f5f5f; background: rgba(141, 141, 141, 0.05);">' . nl2br($comment->comment_content) . '</div>';
$message .= '<br>回复时间:' . $comment->comment_date . '<br><br>';
//$from = "From: "" . get_option('blogname') . "" <$wp_email>";
$headers = "$fromnContent-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');
将这段代码放入主题的 functions.php
文件底部,然后保存。
添加复选框
可能还会遇到一个问题,部分用户或是出于隐私考虑,在评论时会留下一个假邮箱。
如果设置一个复选框,让用户自主选择是否接收邮件通知,就更好了:
//增加复选框
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');
同样地,将上面这段代码放入主题的 functions.php
文件底部。
其它
复选框的样式如果与你的主题不契合,还可以自行修改 #comment_mail_notify
的 CSS 样式。
(本文很短,仅作备忘笔记,再次感谢龙笑天下大佬的知识分享!)
参考资料
[1] 免插件仅代码实现 WordPress 评论回复邮件提醒 – 龙笑天下 https://www.ilxtx.com/wordpress-mail-reply-style.html
[2] 折腾访客邮件回复 – 登山亦有道 https://chenyan98.cn/2772.html
全文完
© 全站文章均为原创,以 CC BY-NC-SA 4.0 公共许可协议进行许可,转载请保留署名和出处。了解更多