WordPress主题中PHP实现自定义相关文章订阅邮件通知求助
问题解决:WordPress分类订阅式新文章邮件通知
原代码的问题分析
- 缺少函数定义:
publish_post钩子绑定的mydomain_send_mail_on_new_post函数未声明,代码结构不完整 - 未正确获取文章数据:直接使用
$post变量,但钩子传递的参数是$post_id,需手动获取文章对象 - 邮件头格式错误:
From字段引号不闭合,换行符混用导致格式失效 - 依赖
HTTP_REFERER判断发布状态不可靠:该值可被篡改或缺失,应使用WordPress内置状态校验 - 未实现分类订阅逻辑:原代码仅发送给固定邮箱,未按用户订阅分类筛选收件人
修复+完整实现代码
以下是包含新发布校验、分类订阅匹配、标准邮件发送的完整代码,可直接添加到主题的functions.php文件末尾:
function mydomain_send_category_subscription_mail( $post_id, $post, $update ) { // 跳过自动保存、草稿、修订版,仅处理首次发布的文章 if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) || $update ) { return; } // 获取当前文章的分类ID(默认取第一个分类,多分类场景可自行调整逻辑) $post_categories = get_the_category( $post_id ); if ( empty( $post_categories ) ) { return; // 无分类的文章不发送通知 } $target_category_id = $post_categories[0]->term_id; // 获取所有订阅该分类的用户 // 假设用用户meta字段 'subscribed_categories' 存储用户订阅的分类ID数组 $subscribed_users = get_users( array( 'meta_query' => array( array( 'key' => 'subscribed_categories', 'value' => $target_category_id, 'compare' => 'LIKE' // 匹配数组中包含目标分类的用户 ) ) ) ); if ( empty( $subscribed_users ) ) { return; // 无订阅用户,直接返回 } // 准备邮件内容 $site_name = get_bloginfo( 'name' ); $post_url = get_permalink( $post_id ); $subject = "[$site_name] 新文章发布:{$post->post_title}"; $message = " <html> <body> <h3>你订阅的分类有新文章啦!</h3> <p>标题:{$post->post_title}</p> <p>链接:<a href='{$post_url}'>点击查看</a></p> </body> </html> "; // 设置标准邮件头 $headers = array( 'From: ' . $site_name . ' <mail@example.com>', 'Reply-To: mail@example.com', 'Content-Type: text/html; charset=UTF-8', 'MIME-Version: 1.0', 'X-Mailer: PHP/' . phpversion() ); // 给每个订阅用户发送邮件 foreach ( $subscribed_users as $user ) { wp_mail( $user->user_email, $subject, $message, $headers ); } } add_action( 'publish_post', 'mydomain_send_category_subscription_mail', 10, 3 );
使用说明
- 用户订阅分类存储:需给用户添加订阅分类的入口(比如个人中心的多选框),将用户选择的分类ID以数组形式存入用户meta字段
subscribed_categories,可借助自定义字段插件快速实现。 - 邮件配置:将代码中的
mail@example.com替换为网站发件邮箱,建议搭配SMTP插件(如WP Mail SMTP)配置邮件服务,避免邮件被标记为垃圾邮件。 - 多分类适配:若文章属于多个分类,可修改
$target_category_id的逻辑,循环所有分类并给对应订阅用户发送通知。 - 测试验证:发布测试文章后,检查对应分类的订阅用户是否收到邮件,若未收到先通过SMTP插件测试邮件功能是否正常。
内容的提问来源于stack exchange,提问作者Abhiupadhyay
相关产品推荐
相关产品推荐

