You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 );

使用说明

  1. 用户订阅分类存储:需给用户添加订阅分类的入口(比如个人中心的多选框),将用户选择的分类ID以数组形式存入用户meta字段subscribed_categories,可借助自定义字段插件快速实现。
  2. 邮件配置:将代码中的mail@example.com替换为网站发件邮箱,建议搭配SMTP插件(如WP Mail SMTP)配置邮件服务,避免邮件被标记为垃圾邮件。
  3. 多分类适配:若文章属于多个分类,可修改$target_category_id的逻辑,循环所有分类并给对应订阅用户发送通知。
  4. 测试验证:发布测试文章后,检查对应分类的订阅用户是否收到邮件,若未收到先通过SMTP插件测试邮件功能是否正常。

内容的提问来源于stack exchange,提问作者Abhiupadhyay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:10:22