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

保存文章时通过ACF字段更新taxonomy字段car_fuel_type赋值失败问题求解

问题原因
  • 初始化变量语法错误:代码行$fuel_type_acf_lang == '';使用了双等号比较运算符,而非单等号赋值运算符,导致变量未正确初始化,后续若未命中任何匹配条件,变量处于未定义状态,无法创建分类项。
  • 未排除save_post钩子的无效触发场景:自动保存、修订版本保存时$_POST中不存在ACF字段数据,此时会传入空值写入分类法,导致更新失败。
  • 分类法slug生成规则错误:直接将包含多语言标签([:el]/[:en]等)的字符串转为小写作为slug,不符合WordPress分类法slug的字符规范,会触发wp_insert_term创建失败。
  • 多层嵌套if判断冗余,容错性差:未做值的trim处理,若ACF字段值前后存在空格、大小写差异时会出现匹配失败的情况,且嵌套结构可读性差容易出现逻辑遗漏。
  • 未做空值拦截:若ACF字段未取值,$fuel_type_acf_lang没有默认值,直接传入分类创建函数必然失败。
修复后实现示例
add_action('save_post', '__hp_frd_year');
function __hp_frd_year($post_id) {
    // 排除自动保存、修订版本、无ACF提交数据的场景
    if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id) || !isset($_POST['acf'])) {
        return;
    }

    $release_date = !empty($_POST['acf']['field_611eb3690a472']) ? $_POST['acf']['field_611eb3690a472'] : '';
    if (empty($release_date)) {
        return;
    }

    $release_date_year = date("Y", strtotime($release_date));
    // 先查询分类是否存在,避免重复创建报错
    $term = get_term_by('name', $release_date_year, 'car_year');
    if (!$term) {
        $new_term = wp_insert_term(
            $release_date_year,
            'car_year',
            array(
                'description' => '',
                'slug' => strtolower($release_date_year),
            )
        );
        if (!is_wp_error($new_term)) {
            $term_id = $new_term['term_id'];
        } else {
            $term_id = $new_term->error_data['term_exists'];
        }
    } else {
        $term_id = $term->term_id;
    }
    wp_set_object_terms($post_id, $term_id, 'car_year');
}

/**
 * 燃油类型分类同步逻辑
 */
add_action('save_post', '__hp_fuel_type');
function __hp_fuel_type($post_id) {
    // 排除自动保存、修订版本、无ACF提交数据的场景
    if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id) || !isset($_POST['acf'])) {
        return;
    }

    $fuel_type_acf = !empty($_POST['acf']['field_612cfc339a8ba']) ? trim($_POST['acf']['field_612cfc339a8ba']) : '';
    if (empty($fuel_type_acf)) {
        return;
    }

    // 用数组映射替代多层嵌套if,逻辑更清晰易维护
    $fuel_type_map = [
        'ΒΕΝΖΙΝΗ' => ['name' => '[:el]ΒΕΝΖΙΝΗ[:en]UNLEADED[:]', 'slug' => 'unleaded'],
        'ΠΕΤΡΕΛΑΙΟ' => ['name' => '[:el]ΠΕΤΡΕΛΑΙΟ[:en]DIESEL[:]', 'slug' => 'diesel'],
        'ΑΕΡΙΟ' => ['name' => '[:el]ΑΕΡΙΟ[:en]GAS[:]', 'slug' => 'gas'],
        'ΥΒΡΙΔΙΚΟ / ΒΕΝΖΙΝΗ' => ['name' => '[:el]ΥΒΡΙΔΙΚΟ / ΒΕΝΖΙΝΗ[:en]HYBRID / UNLEADED[:]', 'slug' => 'hybrid-unleaded'],
        'ΥΒΡΙΔΙΚΟ / ΠΕΤΡΕΛΑΙΟ' => ['name' => '[:el]ΥΒΡΙΔΙΚΟ / ΠΕΤΡΕΛΑΙΟ[:en]HYBRID / DIESEL[:]', 'slug' => 'hybrid-diesel'],
        'ΗΛΕΚΤΡΙΚΟ' => ['name' => '[:el]ΗΛΕΚΤΡΙΚΟ[:en]ELECTRIC[:]', 'slug' => 'electric'],
    ];

    // 匹配不到对应映射直接返回,避免创建无效分类
    if (!isset($fuel_type_map[$fuel_type_acf])) {
        return;
    }

    $term_data = $fuel_type_map[$fuel_type_acf];
    // 先查询分类是否存在,避免重复创建报错
    $term = get_term_by('slug', $term_data['slug'], 'car_fuel_type');
    if (!$term) {
        $new_term = wp_insert_term(
            $term_data['name'],
            'car_fuel_type',
            array(
                'description' => '',
                'slug' => $term_data['slug'],
            )
        );
        if (!is_wp_error($new_term)) {
            $term_id = $new_term['term_id'];
        } else {
            $term_id = $new_term->error_data['term_exists'];
        }
    } else {
        $term_id = $term->term_id;
    }
    wp_set_object_terms($post_id, $term_id, 'car_fuel_type');
}

内容的提问来源于stack exchange,提问作者its4yougr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:54:06