WordPress save_post_news钩子仅在新增文章时触发问题排查
解决仅新增news类型文章时执行操作的问题
问题分析
你的代码中存在几个关键问题导致if($update) return;未生效:
- 变量大小写错误:函数参数是
$post_ID,但后续判断中误用了小写的$post_id,PHP对变量名大小写敏感,导致这些条件判断失效。 - 冗余的
get_post调用:已经通过参数拿到了$post对象,无需再次调用get_post获取状态。 - 未处理自动保存场景:自动保存操作也会触发
save_post_news钩子,需要排除这类情况。
修正后的代码
add_action( 'save_post_news', 'my_project_updated_send_email', 10, 3 ); function my_project_updated_send_email( $post_ID, $post, $update ) { global $wpdb; // 跳过自动保存和修订版本 if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE || wp_is_post_revision( $post_ID ) ){ return; } // 仅在发布状态且为新增文章时执行后续操作 if ( $post->post_status !== 'publish' || $update ){ return; } // 这里写入你的自定义操作逻辑 // do smth... }
关键修正点说明
- 统一变量大小写:全程使用
$post_ID(与参数一致),避免因大小写问题导致的判断失效。 - 合并条件判断:将“非发布状态”和“更新操作”的判断合并,只要满足其中一个就返回,确保仅在新增且发布的news文章时执行逻辑。
- 排除自动保存:添加
DOING_AUTOSAVE判断,避免自动保存触发不必要的操作。 - 直接使用
$post对象:利用传入的$post对象获取状态,提升代码效率。
内容的提问来源于stack exchange,提问作者fireleit
相关产品推荐
相关产品推荐

