在acf/save_post钩子中遍历页面批量更新ACF字段不生效求助
问题修复方案
你这段代码存在4个核心问题,对应修改如下:
- WP_Query未拉取全量页面
默认WP_Query会遵循后台的文章分页设置,只会返回前N条页面数据,需要显式指定posts_per_page => -1拉取全部页面。 - 未处理ACF字段首次赋值的兼容问题
如果目标页面从未存储过temp_post_data字段的值,直接传字段名调用update_field会失效,必须传入ACF后台对应字段的唯一key(格式为field_xxxxxx,可在ACF字段编辑页开启「显示字段key」选项查看)。 - 循环结束后未重置全局post数据
自定义WP_Query循环修改了全局$post变量,会干扰当前settings自定义文章类型的保存逻辑,必须在循环结束后调用wp_reset_postdata()重置。 - 缺少对当前触发保存的文章类型判断
你绑定acf/save_post的逻辑没有限制触发条件,所有文章类型保存都会触发这段遍历逻辑,同时建议设置合适的优先级避免执行时序问题。
修正后的完整代码示例
// 绑定acf/save_post动作,优先级设为20确保在ACF原生保存逻辑执行后触发 add_action('acf/save_post', 'update_all_pages_temp_data', 20); function update_all_pages_temp_data($post_id) { // 仅当保存的是settings自定义文章类型时触发 if (get_post_type($post_id) !== 'settings') { return; } // 排除自动保存、修订版本场景 if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) { return; } // 拉取所有页面 $the_query = new WP_Query( array( 'post_type' => 'page', 'posts_per_page' => -1, 'post_status' => 'publish' // 可根据需求调整要更新的页面状态 ) ); while ( $the_query->have_posts() ) : $the_query->the_post(); // 此处替换为你自己的temp_post_data字段对应的ACF字段key update_field('field_xxxxxxxxx', 'test', get_the_ID()); endwhile; // 重置全局post数据,避免污染当前保存逻辑 wp_reset_postdata(); }
调试参考
- 可在循环内输出
get_the_ID()和update_field的返回值,确认循环是否正常执行、字段更新是否成功返回true - 确认字段设置没有异常的权限限制,ACF字段的后台显示条件不会影响
update_field的执行
内容的提问来源于stack exchange,提问作者user3311868
相关产品推荐
相关产品推荐

