You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:54:02