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

自定义文章类型sfwd-lessons中wp_is_post_revision()判断失效致重复发邮件

我来帮你解决这个问题——你遇到的情况很典型:wp_is_post_revision()只能排除修订版本,但更新已发布的正式文章时,当前的$post_id对应的是主文章本身,不是修订版,所以这个条件拦不住更新操作,导致邮件还是会发送。

下面给你两种可靠的解决方案,优先推荐第一种,因为更简洁准确:

方案一:用wp_after_insert_post钩子(WordPress 5.6+ 推荐)

这个钩子是WordPress在5.6版本新增的,专门用来处理文章插入或更新后的逻辑,它自带一个$update参数,直接告诉你这次操作是更新还是新建,完全不用自己写复杂的判断:

// 当新的课程(sfwd-lessons)创建并发布时发送邮件
function notify_subscriber_new_lesson($post_id, $post, $update) {
    // 如果是更新操作,直接退出
    if ($update) {
        return;
    }

    // 确保是自定义文章类型 sfwd-lessons
    if ($post->post_type !== 'sfwd-lessons') {
        return;
    }

    // 确保文章状态是已发布(如果需要在草稿/待审状态触发,可修改这里)
    if ($post->post_status !== 'publish') {
        return;
    }

    // 这里写你的邮件发送逻辑
    // 比如获取订阅者列表、组装邮件内容等
    wp_mail('subscriber@example.com', '新课程上线啦!', '点击查看最新课程内容');
}
// 钩子优先级设为10,传递3个参数
add_action('wp_after_insert_post', 'notify_subscriber_new_lesson', 10, 3);

方案二:在save_post钩子中手动判断(兼容旧版本WordPress)

如果你的WordPress版本低于5.6,无法使用wp_after_insert_post,可以用这个方法,额外判断文章是否是首次发布,同时排除自动保存和修订版:

// 当新的课程(sfwd-lessons)创建并发布时发送邮件
function notify_subscriber_new_lesson($post_id) {
    // 排除修订版和自动保存的草稿
    if (wp_is_post_revision($post_id) || wp_is_post_autosave($post_id)) {
        return;
    }

    $post = get_post($post_id);
    // 确保是目标自定义文章类型
    if ($post->post_type !== 'sfwd-lessons') {
        return;
    }

    // 检查是否是首次发布:如果文章之前已经是发布状态,说明是更新操作
    $previous_status = get_post_meta($post_id, '_wp_old_status', true);
    if ($post->post_status === 'publish' && $previous_status === 'publish') {
        return; // 已发布文章的更新,不触发邮件
    }

    // 这里写你的邮件发送逻辑
    wp_mail('subscriber@example.com', '新课程上线啦!', '点击查看最新课程内容');
}
// 针对sfwd-lessons类型单独绑定钩子,比全局save_post更高效
add_action('save_post_sfwd-lessons', 'notify_subscriber_new_lesson');

额外说明

如果你的需求是当文章首次被发布时触发(不管之前是不是草稿),而不是仅“新建即发布”,可以在方案一中调整判断逻辑:

function notify_subscriber_new_lesson($post_id, $post, $update) {
    if ($post->post_type !== 'sfwd-lessons' || $post->post_status !== 'publish') {
        return;
    }

    $previous_status = get_post_meta($post_id, '_wp_old_status', true);
    // 要么是新建文章直接发布,要么是从非发布状态转为发布状态
    if (!$update || ($update && $previous_status !== 'publish')) {
        // 发送邮件逻辑
        wp_mail('subscriber@example.com', '新课程上线啦!', '点击查看最新课程内容');
    }
}
add_action('wp_after_insert_post', 'notify_subscriber_new_lesson', 10, 3);

这样不管是直接新建发布,还是从草稿/待审状态转为发布,都会触发一次邮件,后续更新已发布的文章则不会重复发送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:45:34