自定义文章类型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
相关产品推荐
相关产品推荐

