子文章状态设为completed时自动更新父文章postmeta求助
问题分析与解决方案
你想要实现的需求是:当screening类型的子文章状态更新为自定义的completed时,自动把它的父文章的screening_status自定义字段设为screen。你的代码没生效,主要是几个细节没处理对,我帮你梳理下问题并给出修正后的代码:
原代码的问题点
- 没有正确接收
save_post钩子的参数,直接使用$post和$post_type会导致变量未定义 get_the_ID($post->post_parent)用法错误,$post->post_parent本身就是父文章ID,不需要用get_the_ID()包裹- 没有排除自动保存、修订版本的情况,可能导致钩子被不必要地触发
- 没有校验父文章是否存在,直接更新元数据可能引发错误
修正后的代码
add_action('save_post', 'update_status_parent_when_completed', 10, 3); function update_status_parent_when_completed($post_id, $post, $update){ // 排除自动保存、修订版本,以及非screening类型的文章 if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id) || $post->post_type !== 'screening') { return; } // 检查当前文章状态是否是自定义的completed if ($post->post_status === 'completed') { $parent_id = $post->post_parent; // 确保父文章存在 if ($parent_id && get_post($parent_id)) { update_post_meta($parent_id, 'screening_status', 'screen'); } } }
代码说明
- 钩子参数:
save_post钩子可以接收3个参数,我们显式声明$post_id, $post, $update,这样能直接拿到当前文章的完整对象和状态 - 排除不必要的触发:用
wp_is_post_autosave和wp_is_post_revision排除自动保存和修订版本的情况,避免无效执行 - 校验父文章:先判断
$parent_id是否存在,再用get_post($parent_id)确认父文章确实存在,防止更新不存在的文章元数据 - 正确获取父ID:直接使用
$post->post_parent拿到父文章ID,不需要额外函数处理
这样修改后,应该就能正常触发父文章的元数据更新了。
内容的提问来源于stack exchange,提问作者Muhammad Ibrahim
相关产品推荐
相关产品推荐

