记得很早以前见过网上有这个功能来着,找了几次没找到,于是试着重新给 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 );