记得很早以前见过网上有这个功能来着,找了几次没找到,于是试着重新给 WordPress 的邮件通知增加延迟发送的功能。个人感觉这个功能还是不错的,能够非常有效的加速提交评论的速度。其实评论提交后进行邮件通知这个操作不着急的,晚个几十秒没问题,但提交评论的速度哪怕晚上一秒都会大大降低体验感。
使用这段代码前需要将(Wordpress 设置-讨论-发送邮件通知我)选项的对勾取消。因为在使用 wordpress 自带的邮件通知管理员功能尝试了好几次,延迟发送总是没有效果,具体是什么原因造成的一直找不到。所以我就在代码中增加了邮件通知管理员的代码。这样也好,就可以下来方便单独制定通知管理员的邮件模版了。
代码包含对所有评论进行通知(包括回复和管理员通知),并延迟三十秒发送邮件,具体的 WordPress 邮件通知延迟发送代码记录如下:
// 评论邮件通知函数,通知被回复的评论作者
function comment_mail_notify( $comment_id, $commentdata ) {
// 检查是否有父评论,并且当前评论不是垃圾评论
if ( isset( $commentdata['comment_parent'] ) && (int) $commentdata['comment_parent'] > 0 && ( $commentdata['comment_approved'] != 'spam' ) ) {
// 设置发件人邮箱,请将 'admin@kkn.me' 替换为你自己的邮箱地址
$wp_email = 'admin@kkn.me' . preg_replace( '#^www\.#', '', strtolower( $_SERVER['SERVER_NAME'] ) );
$parent_id = $commentdata['comment_parent'];
$parent = get_comment( $parent_id ); // 获取父评论信息
$to = trim( $parent->comment_author_email );
$subject = '您的留言在 [' . get_option( "blogname" ) . '] 有了新的回复';
$title = trim( get_the_title( $commentdata['comment_post_ID'] ) );
// 构建邮件内容
$message = '<div style="border-right:#666666 1px solid;border-radius:8px;color:#111;font-size:12px;width:95%;border-bottom:#666666 1px solid;font-family:微软雅黑,arial;margin:10px auto 0px;border-top:#666666 1px solid;border-left:#666666 1px solid">';
$message .= '<div class="adM"></div>';
$message .= '<div style="width:100%;background:#666666;min-height:60px;color:white;border-radius:6px 6px 0 0">';
$message .= '<span style="line-height:60px;min-height:60px;margin-left:30px;font-size:12px">您在 <a style="color:#00bbff;font-weight:600;text-decoration:none" href="' . get_option('home') . '" target="_blank">' . get_option('blogname') . '</a> 上的留言有回复啦!</span></div>';
$message .= '<div style="margin:0px auto;width:90%">';
$message .= '<p><span style="font-weight:bold;">' . trim( $parent->comment_author ) . '</span> 您好!</p>';
$message .= '<p>您在文章《' . $title . '》上发表的评论:</p>';
$message .= '<p style="border-bottom:#ddd 1px solid;border-left:#ddd 1px solid;padding-bottom:20px;background-color:#eee;margin:15px 0px;padding-left:20px;padding-right:20px;border-top:#ddd 1px solid;border-right:#ddd 1px solid;padding-top:20px">' . nl2br( $parent->comment_content ) . '</p>';
$message .= '<p><span style="font-weight:bold;">' . trim( $commentdata['comment_author'] ) . '</span> 给您回复如下:</p>';
$message .= '<p style="border-bottom:#ddd 1px solid;border-left:#ddd 1px solid;padding-bottom:20px;background-color:#eee;margin:15px 0px;padding-left:20px;padding-right:20px;border-top:#ddd 1px solid;border-right:#ddd 1px solid;padding-top:20px">' . nl2br( $commentdata['comment_content'] ) . '</p>';
$message .= '<p>您可以点击 <a style="color:#00bbff;text-decoration:none" href="' . htmlspecialchars( get_comment_link( $comment_id ) ) . '" target="_blank">查看回复的完整内容</a></p>';
$message .= '<p style="color:#A8979A;">(此邮件由系统自动发出,请勿回复。)</p></div></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 );
}
}
// 通知管理员的新评论邮件函数
function admin_comment_mail_notify( $comment_id, $commentdata ) {
$comment_author_email = $commentdata['comment_author_email'];
$admin_email = get_option( 'admin_email' );
// 检查当前评论是否是对管理员评论的回复
if ( isset( $commentdata['comment_parent'] ) && (int) $commentdata['comment_parent'] > 0 ) {
$parent_comment = get_comment( $commentdata['comment_parent'] );
// 如果父评论的作者是管理员,则不发送新评论通知
if ( $parent_comment->comment_author_email === $admin_email ) {
return;
}
}
// 当评论者不是管理员时发送通知
if ( $comment_author_email !== $admin_email ) {
// 设置发件人邮箱,请将 'admin@kkn.me' 替换为你自己的邮箱地址
$wp_email = 'admin@kkn.me' . preg_replace( '#^www\.#', '', strtolower( $_SERVER['SERVER_NAME'] ) );
$subject = '新评论通知 [' . get_option( "blogname" ) . ']';
$title = trim( get_the_title( $commentdata['comment_post_ID'] ) );
// 构建邮件内容
$message = '<p>您的文章《' . $title . '》有一条新评论:</p>';
$message .= '<p>作者: ' . $commentdata['comment_author'] . '</p>';
$message .= '<p>评论内容: ' . nl2br( $commentdata['comment_content'] ) . '</p>';
$message .= '<p><a href="' . htmlspecialchars( get_comment_link( $comment_id ) ) . '">查看评论</a></p>';
$message .= '<p style="color:#A8979A;">(此邮件由系统自动发出,请勿回复。)</p>';
// 设置邮件头
$from = "From: \"" . get_option( 'blogname' ) . "\" <$wp_email>";
$headers = "$from\nContent-Type: text/html; charset=" . get_option( 'blog_charset' ) . "\n";
// 发送邮件
wp_mail( $admin_email, $subject, $message, $headers );
}
}
// 将评论邮件发送任务延迟执行
function schedule_comment_mail_notify( $comment_id, $comment_approved, $commentdata ) {
// 计划任务延迟执行,通知评论作者
wp_schedule_single_event( time() + 30, 'send_comment_mail_event', array( $comment_id, $commentdata ) );
}
// 将管理员通知任务延迟执行
function schedule_admin_comment_mail_notify( $comment_id, $comment_approved, $commentdata ) {
// 计划任务延迟执行,通知管理员
wp_schedule_single_event( time() + 30, 'send_admin_comment_mail_event', array( $comment_id, $commentdata ) );
}
// 添加动作钩子,延迟发送评论作者邮件,接受3个参数
add_action( 'comment_post', 'schedule_comment_mail_notify', 10, 3 );
// 添加动作钩子,延迟发送管理员邮件,接受3个参数
add_action( 'comment_post', 'schedule_admin_comment_mail_notify', 10, 3 );
// 定义评论回复邮件发送事件,接受2个参数
add_action( 'send_comment_mail_event', 'comment_mail_notify', 10, 2 );
// 定义管理员邮件发送事件,接受2个参数
add_action( 'send_admin_comment_mail_event', 'admin_comment_mail_notify', 10, 2 );