WordPress发布新post时publish_post钩子不生效,无法更新series自定义文章元数据?
问题原因
- 钩子触发优先级问题:
publish_post钩子默认优先级是10,首次发布文章时,ACF自定义字段、分类数据的保存动作优先级晚于10,代码执行时读取不到upcoming_episode的正确值,也可能读取不到刚分配的分类数据,因此判断不通过、逻辑不执行。更新文章时字段和分类早已存在,所以可以正常读取执行。 - 代码缺少健壮性判断:未处理分类为空、未匹配到对应
series文章的场景,极端情况下会触发PHP报错,中断后续流程。 - 分类取值逻辑缺陷:循环遍历分类时仅保留最后一个分类的名称,若单篇文章分配了多个分类,会导致匹配
series文章时出现预期外的结果。
修复后的代码
// 调整钩子优先级为20,晚于ACF和分类数据的保存动作 add_action('publish_post', 'create_asim_update_series_date_pub', 20); function create_asim_update_series_date_pub($post_id) { // 排除自动保存和修订版本,避免重复执行 if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) { return; } $upcoming_episode_value = get_post_meta($post_id,'upcoming_episode',true); if ($upcoming_episode_value === "No") { $category_details = get_the_category($post_id); // 跳过未分配分类的文章 if (empty($category_details)) { return; } // 此处保留原逻辑:取最后一个分类名,若需要取首个分类可直接写为 $my_category_name = $category_details[0]->cat_name $my_category_name = ''; foreach($category_details as $category_detail){ $my_category_name = $category_detail->cat_name; } $my_series_detail = get_page_by_title($my_category_name, OBJECT, 'series'); // 跳过未匹配到对应series文章的场景 if (empty($my_series_detail)) { return; } $my_series_id = $my_series_detail->ID; update_post_meta( $my_series_id, 'asim_update_date', date('YmdHis') ); update_post_meta( $my_series_id, 'asim_update_time', date('YmdHis') ); } }
补充说明
- 若调整优先级后仍有适配问题,可将钩子替换为
save_post_post,该钩子专门针对post类型文章的保存动作,触发时机更稳定。 - 如果你的站点允许单篇文章分配多个分类,建议明确调整分类取值逻辑,指定使用哪个分类的名称匹配series文章,避免逻辑混乱。
内容的提问来源于stack exchange,提问作者Asim Javed
相关产品推荐
相关产品推荐

