WordPress save_post钩子仅在首次发布时触发的问题求助
解决WordPress仅在文章首次发布时触发API推送的问题
我明白你现在遇到的问题——save_post钩子触发时机太宽泛,而且$update参数没达到预期效果,没法精准捕捉首次发布的场景。其实这个问题在WordPress里挺常见的:当你把草稿、待审的帖子改成发布状态时,$update还是会返回true(因为帖子已经存在数据库中),所以单纯靠这个参数没法区分“首次发布”和“已发布文章更新”。
下面给你一套精准的解决方案,结合帖子状态变化和WordPress内置函数来过滤触发时机:
关键判断逻辑
要实现仅在首次发布时执行代码,需要同时满足以下几个条件:
- 排除自动保存和修订版本(避免不必要的触发)
- 帖子类型是
post(匹配你的需求) - 当前帖子状态是
publish - 帖子的原始状态(更新前)不是
publish(确保是第一次从非发布状态转为发布) - 确认是手动操作,而非系统自动触发
修改后的代码
function save_post_callback( $post_id, $post, $update ) { // 排除自动保存、修订版本、非post类型 if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) || $post->post_type !== 'post' ) { return; } // 获取帖子更新前的状态(如果是首次创建,原始状态会是auto-draft或draft) $original_status = get_post_meta( $post_id, '_wp_old_status', true ); // 仅在首次发布时执行:当前状态是publish,且之前不是publish if ( $post->post_status === 'publish' && $original_status !== 'publish' ) { // 在这里执行你的第三方API推送逻辑 // 比如:send_to_third_party( $post ); } } add_action( 'save_post', 'save_post_callback', 100, 3 );
代码解释
- 排除干扰触发:用
wp_is_post_autosave和wp_is_post_revision过滤掉自动保存和修订版本的触发,这些场景都不是我们需要的手动发布操作。 - 原始状态判断:
_wp_old_status是WordPress自动保存的帖子更新前的状态元数据,通过它可以精准判断当前是不是第一次把帖子改成发布状态——不管之前是草稿、待审还是自动草稿,只要转成发布,就会触发。 - 状态双重验证:同时检查当前状态是
publish且原始状态不是publish,彻底排除已发布文章更新的场景。
如果你之前是用类方法调用,只要把函数改成类内方法,调整钩子绑定即可,核心逻辑完全一致。
内容的提问来源于stack exchange,提问作者user254153
相关产品推荐
相关产品推荐

