WordPress中ACF布尔字段联动动态下拉选项问题排查
排查ACF动态下拉字段代码错误及修复方案
代码中的核心错误
get_field()调用逻辑错误:在acf/load_field钩子中,直接调用get_field('fruits_selection')无法获取当前编辑文章的字段值——缺少当前文章ID参数,新文章未保存时更是无法读取到任何值。array_push用法完全错误:array_push的第一个参数必须是要修改的目标数组,返回值是数组的新长度,而非数组本身。你写成$choices = array_push(...)会把$choices变成数字类型,后续is_array($choices)判断会返回false,导致选项无法添加。- ACF下拉选项格式错误:ACF下拉字段要求选项是
[键 => 显示文本]的键值对结构,你把键和文本合并成单个字符串,不符合字段规范。 - 未处理新文章场景:创建新文章时无字段值,原代码未做空值处理,容易触发报错破坏后台AJAX响应。
修正后的代码
function acf_load_platform_field_choices( $field ) { // 重置选项 $field['choices'] = array(); $choices = array(); // 获取当前编辑的文章ID,适配新/旧文章编辑场景 $post_id = isset($_GET['post']) ? intval($_GET['post']) : 0; // 传入文章ID获取字段值,新文章时会返回false $fruits = get_field('fruits_selection', $post_id); $veggies = get_field('veggies_selection', $post_id); $items = get_field('items_selection', $post_id); if( $fruits ) { $choices = array_merge($choices, array( 'apple-bundles' => 'Mix of apples', 'banana-bundles' => 'Bananas basket', 'kiwi-set' => 'Tasty kiwi set' )); } if( $veggies ) { $choices = array_merge($choices, array( 'potato-bag' => '10lbs Potato Bag' )); } if( $items ) { $choices = array_merge($choices, array( 'basket' => 'Wooden basket' )); } // 将整理好的键值对赋值给字段选项 if( is_array($choices) && !empty($choices) ) { $field['choices'] = $choices; } return $field; } add_filter('acf/load_field/name=platform', 'acf_load_platform_field_choices');
额外说明
- 新增
$post_id获取逻辑,确保能读取当前编辑文章的字段状态,新文章时$post_id为0,get_field返回false,对应选项不会被添加。 - 用
array_merge替代错误的array_push,正确合并不同条件下的选项数组。 - 修正ACF下拉选项的键值对结构,符合字段要求。
- 保存时的JSON响应错误是原代码报错(如
array_push参数错误)导致输出PHP错误信息,破坏了后台AJAX响应格式,修正代码后该问题会自动解决。
内容的提问来源于stack exchange,提问作者Julia Galden
相关产品推荐
相关产品推荐

