You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:02:05