WordPress:如何在同步块模式中获取父组块的$context
解决ACF组块上下文传递到同步模式(Synced Pattern)的问题
同步模式块在渲染时会被独立解析,不会自动继承父ACF组块的上下文,以下是两种可行的解决方案:
方案1:通过render_block_data钩子注入上下文
这个钩子能在块渲染前修改数据,把父组块的上下文传递到同步模式内部的子块中。
步骤1:添加全局上下文传递逻辑
在主题的functions.php或自定义插件中添加以下代码:
add_filter('render_block_data', function($parsed_block, $source_block) { // 检测当前是否为同步模式块 if ($parsed_block['blockName'] === 'core/block') { $pattern_post = get_post($parsed_block['attrs']['ref']); // 验证同步模式的合法性 if ($pattern_post && $pattern_post->post_type === 'wp_block') { $pattern_blocks = parse_blocks($pattern_post->post_content); // 读取全局上下文变量(后续在父组块中设置) global $acf_group_context; if (!empty($acf_group_context)) { // 递归给模式内所有子块注入上下文 $inject_context = function(&$blocks) use ($acf_group_context, &$inject_context) { foreach ($blocks as &$block) { // 仅给声明使用acf/groupData的块注入数据 if (isset($block['attrs']['usesContext']) && in_array('acf/groupData', $block['attrs']['usesContext'])) { $block['context']['acf/groupData'] = $acf_group_context; } // 处理内部嵌套块 if (!empty($block['innerBlocks'])) { $inject_context($block['innerBlocks']); } } }; $inject_context($pattern_blocks); // 替换同步模式的内部块为处理后的版本 $parsed_block['innerBlocks'] = $pattern_blocks; } } } return $parsed_block; }, 10, 2);
步骤2:在父组块模板中设置全局上下文
修改你的ACF组块模板文件,在渲染<InnerBlocks />前设置全局上下文:
<?php // 获取当前组块的data字段值(替换为你的实际字段名) $group_data = get_field('data'); // 设置全局上下文变量 global $acf_group_context; $acf_group_context = $group_data; ?> <InnerBlocks /> <?php // 渲染后清空变量,避免污染其他块 $acf_group_context = null; ?>
方案2:利用block_context钩子强制继承上下文
通过这个钩子,让同步模式内部的块自动继承父ACF组块的上下文:
add_filter('block_context', function($context, $block) { // 检查父块是否为你的ACF组块,且上下文存在 if (!empty($context['acf/groupData'])) { $current_block = $block; // 递归向上查找父块 while (isset($current_block['parent'])) { $current_block = $current_block['parent']; if ($current_block['blockName'] === 'acf/your-group-block') { // 替换为你的组块名称 return array_merge($context, ['acf/groupData' => $current_block['context']['acf/groupData']]); } } } return $context; }, 10, 2);
编辑器预览适配(可选)
如果编辑器中预览同步模式时也丢失上下文,添加前端JS代码(可通过ACF的块脚本或主题脚本加载):
wp.hooks.addFilter('editor.BlockEdit', 'acf/group-context-pattern-fix', (BlockEdit, props) => { // 检测当前块是否在目标ACF组块内部,且需要上下文 if (props.context?.['acf/groupData'] && props.parent?.blockName === 'acf/your-group-block') { const newProps = { ...props, context: { ...props.context, 'acf/groupData': props.context['acf/groupData'] } }; return <BlockEdit {...newProps} />; } return <BlockEdit {...props} />; });
内容的提问来源于stack exchange,提问作者Glen Satchwell
相关产品推荐
相关产品推荐

