ACF绑定文章分类的自定义字段首次发布文章时无法保存问题
ACF+古腾堡首次发布字段不保存问题解决方案
根因说明
古腾堡采用REST API异步提交内容,首次发布文章时,文章分类赋值与ACF自定义字段提交存在时序冲突:ACF执行字段保存校验时,文章还未完成nature分类的关联,触发显示规则限制,直接丢弃了本次提交的自定义字段内容。二次编辑时文章已绑定对应分类,ACF校验通过,字段即可正常保存。
解决方案
方案1:升级ACF到最新稳定版
ACF 5.12及以上版本已官方修复古腾堡下分类关联与字段保存的时序冲突问题,直接在WordPress后台插件页更新ACF插件即可解决大部分同类问题。
方案2:调整ACF字段保存优先级
如果暂时无法升级ACF,可将以下代码添加到当前主题functions.php文件,调高ACF字段保存优先级,等分类关联完成后再执行字段保存:
add_action('acf/save_post', function($post_id) { // 仅适配古腾堡REST请求场景 if (defined('REST_REQUEST') && REST_REQUEST && get_post_type($post_id) === 'post') { remove_action('acf/save_post', [ACF_Save_Post::instance(), 'save_post'], 10); add_action('acf/save_post', [ACF_Save_Post::instance(), 'save_post'], 20); } }, 5);
方案3:修改ACF分类显示规则的判断逻辑
若上述方案无效,可添加以下代码到主题functions.php,强制ACF校验显示规则时读取数据库中已保存的分类关联数据,而非前端提交的临时数据:
add_filter('acf/location/rule_match/post_category', function($match, $rule, $options) { if (defined('REST_REQUEST') && REST_REQUEST && !empty($options['post_id'])) { $category_slugs = wp_get_post_categories($options['post_id'], ['fields' => 'slug']); if ($rule['operator'] === '==') { $match = in_array($rule['value'], $category_slugs); } elseif ($rule['operator'] === '!=') { $match = !in_array($rule['value'], $category_slugs); } } return $match; }, 10, 3);
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

