WordPress如何避免save_post钩子绑定代码在自动保存时触发
问题原因
你现有代码异常触发的核心是save_post钩子会在所有文章数据写入数据库的场景下执行,包括草稿自动保存、编辑器手动存草稿、古腾堡后台静默预存等场景,原判断逻辑仅排除了原生自动保存和修订版本,没有覆盖未发布状态的保存、已发布文章更新的场景。
解决方案
方案1:优化原有save_post逻辑
在原有判断基础上新增自动保存常量校验、发布状态校验、历史发布状态校验,确保仅首次发布时触发:
function send_notification($post_id, $post, $update){ // 全场景排除自动保存、修订版本 if ( wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) || ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) ) { return; } // 仅处理目标自定义文章类型 if ( get_post_type( $post_id ) !== 'vip_post' ) { return; } // 排除已发布文章的更新操作 if ( $update && get_post_status( $post_id ) === 'publish' ) { return; } // 仅文章状态为发布时执行业务逻辑 if ( $post->post_status === 'publish' ) { send_message($post->post_content); } } // 引入第三个参数$update区分新建/更新场景 add_action('save_post', 'send_notification', 10, 3);
方案2:换用更精准的状态变更钩子(更推荐)
transition_post_status是WordPress专门用来监听文章状态变更的钩子,天然不会被自动保存、修订版本等场景触发,逻辑更简洁:
function send_notification_on_publish( $new_status, $old_status, $post ) { // 仅首次从非发布状态转为发布状态、且是目标文章类型时触发 if ( $new_status === 'publish' && $old_status !== 'publish' && $post->post_type === 'vip_post' ) { send_message( $post->post_content ); } } add_action( 'transition_post_status', 'send_notification_on_publish', 10, 3 );
可选调整
如果你需要已发布文章更新后也重新触发逻辑,只需要删除方案1中的「排除已发布文章的更新操作」判断块,或者把方案2的条件改为$new_status === 'publish'即可。
内容的提问来源于stack exchange,提问作者Tasos
相关产品推荐
相关产品推荐

