保存文章时通过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
相关产品推荐
相关产品推荐

