邮箱订阅网站推广常用到的,Simple Subscribe 这款插件虽然功能强大,但毕竟是国外的插件,到了国内就不好使了。包括发信的模版全是英文,汉化的话也费时费力。最后找到了 Mail Subscribe List 这款插件。这个插件十分简洁,仅6个文件,PHP文件仅3个,也因如此,它的功能十分有限,仅能用来收集订阅(自带一个小工具)和导出导入订阅用户。但不用着急,本文将使用 Mail Subscribe List 插件加一段代码,实现文章发布后邮件通知订阅用户。代码原版来自 DZ9,E 经过修改后实现了本文的功能。
收集订阅用户安装 Mail Subscribe List 插件,在主题小工具里将 Subscribe Form 小工具加入到需要的位置,由于主题的差异,前端如果不美观,可以自己用CSS进行美化。这是 E 根据 Exiang2 主题美化过的订阅表单效果。
文章发布后发信加以下代码加入主题的最后一个?>前即可。
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');效果示例
结语使用上文的方法,可以对订阅邮件根据自己的需要定义,不再依靠第三方服务,当然更自由。但由于是在发布文章时推用订阅邮件,所以文章发布速度会大大拖慢,这和订阅数量是成正比的。决解这个问题的方法就是利用 WordPress 的定时任务。