干货分享 wordpress怎样实现发布文章邮箱通知

邮箱订阅网站推广常用到的,Simple Subscribe 这款插件虽然功能强大,但毕竟是国外的插件,到了国内就不好使了。包括发信的模版全是英文,汉化的话也费时费力。最后找到了 Mail Subscribe List 这款插件。这个插件十分简洁,仅6个文件,PHP文件仅3个,也因如此,它的功能十分有限,仅能用来收集订阅(自带一个小工具)和导出导入订阅用户。但不用着急,本文将使用 Mail Subscribe List 插件加一段代码,实现文章发布后邮件通知订阅用户。代码原版来自 DZ9,E 经过修改后实现了本文的功能。

收集订阅用户

安装 Mail Subscribe List 插件,在主题小工具里将 Subscribe Form 小工具加入到需要的位置,由于主题的差异,前端如果不美观,可以自己用CSS进行美化。这是 E 根据 Exiang2 主题美化过的订阅表单效果。

Email Subscribe1

文章发布后发信

加以下代码加入主题的最后一个?>前即可。

function newPostNotify($post_ID) {      if( wp_is_post_revision($post_ID) ) return;      global $wpdb;      $get_post_info = get_post($post_ID);      if ( $get_post_info->post_status == 'publish' && $_POST['original_post_status'] !='publish' ) {          // 读数据库,获取所有订阅用户的email    $sml_emails = $wpdb->get_results("SELECT DISTINCT sml_email FROM wp_sml");          // 依次给每个Email发邮件         foreach ( $sml_emails as $email ) {              // 邮件标题:xx博客有新文章可自定义             $subject = 'xx博客有新文章';              // 邮件内容:新文章网址:+ URL              $message = '新文章网址:' . get_permalink($post_ID);              // 发邮件             wp_mail($email->sml_email, $subject, $message);          }      } } // 钩子,一旦WordPress有新文章发布或文章被修改即刻执行newPostNotify函数 add_action('publish_post', 'newPostNotify'); 自定义发信内容

上面的代码 E 仅将原版代码向注册用户发信,改为向订阅用户发信,且发信内容不支持 HTML 代码。经过进一步修改,咱就可以在发信内容里加入HTML代码了,让发出去的信件更美观,E 还提供了以下可能用到的数据,已向 PHP变量 赋值,可以更好地自定义发信内容,但需要懂点代码。

function newPostNotify($post_ID) {      if( wp_is_post_revision($post_ID) ) return;      global $wpdb;      $get_post_info = get_post($post_ID);      if ( $get_post_info->post_status == 'publish' && $_POST['original_post_status'] !='publish' ) {          // 读数据库,获取所有订阅用户的email $sml_emails = $wpdb->get_results("SELECT DISTINCT sml_email FROM wp_sml");     $wp_email = 'no-reply@' . preg_replace('#^www\.#', '',strtolower($_SERVER['SERVER_NAME'])); // e-mail 发出点, no-reply 可改为可用的 e-mail.                              $from = "From: \"" . get_option('blogname') . "\" <$wp_email>";     $headers = "$from\nContent-Type: text/html; charset=" . get_option('blog_charset') . "\n";         //下面是一些可能调用到的数据,可以用到邮件内容和邮件标题中,不需要用到的请删除         $post_title=$get_post_info->post_title;//文章标题         $post_link=get_permalink($post_ID);//文章链接         $post_content=$get_post_info->post_content;//文章内容         $post_content_main=mb_strimwidth(strip_tags(apply_filters('the_content',$post_content)),0,300,"...");//摘取文章内容,300 可自定义         if(preg_match('/<img.+src=\"?(.+\.(jpg|gif|bmp|bnp|png))\"?.+>/i',$post_content,$match)){//获取第一张图片地址     $post_img= preg_replace('/["]+/i','',$match[1]);}         else {         $post_img='';} // 依次给每个Email发邮件         foreach ( $sml_emails as $email ) {              // 邮件标题:网站名+文章标题             $subject = 'E享乐:'.$post_title;              // 邮件内容:新文章网址:+ URL              $message = ' 发信内容可以自定义,可以使用 HTML CSS 代码,和上面已经创建的变量     ' ;              // 发邮件     wp_mail( $email->sml_email, $subject, $message, $headers );                         }      } } // 钩子,一旦WordPress有新文章发布或文章被修改即刻执行newPostNotify函数 add_action('publish_post', 'newPostNotify');

效果示例

Email Subscribe

结语

使用上文的方法,可以对订阅邮件根据自己的需要定义,不再依靠第三方服务,当然更自由。但由于是在发布文章时推用订阅邮件,所以文章发布速度会大大拖慢,这和订阅数量是成正比的。决解这个问题的方法就是利用 WordPress 的定时任务。