保存时自定义ACF选项页面值的正确方法
我完全懂你遇到的这个问题——在ACF选项页面保存时用acf/save_post钩子拿到的值不对,甚至发现wp_options里存了好几个相关字段,确实容易搞懵。其实是因为选项页面的存储逻辑和常规帖子不一样,咱们得用针对性的方法来处理:
核心问题所在
ACF选项页面的post_id是特殊值(默认是'options',如果是自定义选项页面则是你设置的menu_slug),而常规的acf/save_post钩子默认适配的是普通帖子,所以直接拿值会出现字段匹配错误的情况。另外wp_options里的多个字段是ACF的正常机制——它会同时存储字段名称、字段key对应的元数据,不用太担心。
正确的处理方法
1. 先判断是否为选项页面的保存动作
在钩子函数里先过滤掉非选项页面的请求,避免影响常规帖子的保存:
add_action('acf/save_post', 'handle_acf_options_save', 20); // 优先级设为20,确保在ACF默认保存逻辑之后执行 function handle_acf_options_save($post_id) { // 针对默认ACF选项页面,判断post_id是否为'options' // 如果是自定义选项页面,替换成你的menu_slug,比如'my-custom-options' if ($post_id !== 'options') { return; } // 后续的字段修改逻辑写在这里 }
2. 正确获取和修改选项字段值
获取选项字段时,必须指定第三个参数为选项页面的标识('options'或自定义slug),否则会默认读取当前帖子的字段值,自然不对。修改后用update_field保存时也要带上这个参数:
add_action('acf/save_post', 'handle_acf_options_save', 20); function handle_acf_options_save($post_id) { if ($post_id !== 'options') { return; } // 获取当前选项字段的值 $original_value = get_field('your_field_name', 'options'); // 这里写你的值修改逻辑,比如给文本加前缀 $modified_value = 'processed_' . $original_value; // 更新选项字段,第三个参数必须传'options' update_field('your_field_name', $modified_value, 'options'); }
3. 提前修改提交的值(可选)
如果你想在ACF执行保存逻辑前就修改提交的原始值,可以把钩子优先级设为低于10(ACF默认保存优先级是10),直接修改$_POST里的ACF数据:
add_action('acf/save_post', 'modify_acf_options_submit_data', 5); function modify_acf_options_submit_data($post_id) { if ($post_id !== 'options') { return; } // 注意这里要用字段的key(比如field_123456789),不是字段名称 if (isset($_POST['acf']['field_123456789'])) { $_POST['acf']['field_123456789'] = 'pre-modified-' . $_POST['acf']['field_123456789']; } }
关键注意事项
- 如果是自定义选项页面,一定要把判断里的
'options'换成你注册页面时设置的menu_slug; - 字段key可以在ACF字段编辑页面的「字段设置」底部找到,比字段名称更稳定;
- 优先级的选择:要在ACF保存后修改就用>10的优先级,要在保存前修改提交数据就用<10的优先级。
内容的提问来源于stack exchange,提问作者Simon Pollard
相关产品推荐
相关产品推荐

