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

使用wp_insert_post_data无法获取文章ID及分类,求助自动生成标题

搞定自动生成分类+ID标题的问题

我来帮你解决这个标题自动生成的问题!你的当前代码有两个核心问题导致拿不到正确的分类和ID信息:

  1. 新建文章时无ID可用:wp_insert_post_data钩子是在文章存入数据库之前触发的,这时候新文章还没生成ID,$postarr['ID']自然是空的。
  2. 分类值处理错误:$postarr['post_category']其实是个分类ID的数组,直接拼接会输出Array字符串,根本不是你想要的格式。而且新文章在这个钩子阶段,分类还没正式关联到文章上,数据也不准确。

最优解决方案:改用save_post钩子

最靠谱的方式是用save_post钩子——这个钩子在文章存入数据库之后触发,既能拿到文章ID,也能正确获取已经关联好的分类信息。下面是修改后的代码:

function my_set_post_title($post_id, $post, $update) {
    // 跳过自动保存和修订版本,避免重复触发
    if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
        return;
    }

    // 获取文章关联的分类(默认取第一个分类,多分类可调整逻辑)
    $categories = get_the_category($post_id);
    if (!empty($categories)) {
        $category = $categories[0];
        $category_name = $category->name; // 分类名称
        $category_id = $category->term_id; // 分类ID
        
        // 生成你想要的标题格式,这里是「分类名称-分类ID-文章ID」
        $new_title = "{$category_name}-{$category_id}-{$post_id}";
        
        // 更新标题时临时移除钩子,防止无限循环
        remove_action('save_post', 'my_set_post_title');
        wp_update_post(array(
            'ID' => $post_id,
            'post_title' => $new_title
        ));
        add_action('save_post', 'my_set_post_title');
    }
}
add_action('save_post', 'my_set_post_title', 10, 3);

代码说明

  • 跳过自动保存和修订:避免钩子被反复触发,造成不必要的错误。
  • 获取分类信息:用get_the_category()拿到文章的关联分类,默认取第一个,如果你需要处理多分类,可以自己调整逻辑(比如拼接所有分类ID)。
  • 防止无限循环:更新标题时先移除钩子,更新完再加回来,避免wp_update_post再次触发save_post钩子。
  • 灵活调整格式:如果你只想用分类ID+文章ID,把$new_title改成"{$category_id}-{$post_id}"就行。

备选方案:保留wp_insert_post_data钩子(仅适用于后台手动发布)

如果你坚持要用原来的钩子,那可以从$_POST里拿提交的分类ID(但只适合后台手动发文章的场景,API创建的话$_POST不存在),同时要等文章插入后再更新标题:

function my_post_titles($data, $postarr){
    // 处理新建文章的情况
    if (empty($postarr['ID'])) {
        // 从POST数据里取分类ID
        $category_ids = isset($_POST['post_category']) ? $_POST['post_category'] : array();
        if (!empty($category_ids)) {
            $category_id = $category_ids[0];
            // 用匿名函数在文章插入后更新标题
            add_action('save_post', function($post_id) use ($category_id) {
                if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
                    return;
                }
                $category = get_category($category_id);
                $new_title = "{$category->name}-{$category_id}-{$post_id}";
                // 同样要移除钩子防止循环
                remove_action('save_post', current_action());
                wp_update_post(array('ID' => $post_id, 'post_title' => $new_title));
            }, 11);
        }
    } else {
        // 更新文章时直接生成标题
        $categories = get_the_category($postarr['ID']);
        if (!empty($categories)) {
            $category = $categories[0];
            $data['post_title'] = "{$category->name}-{$category->term_id}-{$postarr['ID']}";
        }
    }
    return $data;
}
add_filter('wp_insert_post_data', 'my_post_titles', 99, 2 );

但还是更推荐第一个save_post的方案,兼容性更好,逻辑也更清晰。

内容的提问来源于stack exchange,提问作者G.I.George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:17:06