ACF Blocks字段无法在header.php调用输出,MU插件是否有影响?
问题分析与解决方案
MU插件不是导致你拿不到字段的原因,无需纠结这点。
为什么header里无法获取ACF Blocks字段?
ACF Blocks的字段并非存储在文章元数据(post meta)中,而是作为Gutenberg块的一部分,嵌套存储在文章的post_content里。你之前用的have_rows('block_faq')是读取常规绑定到文章类型的ACF字段组的方法,没法直接读取块内的字段;再加上header.php执行时,Gutenberg块还未被解析,自然拿不到数据。正确的获取方法
你需要先解析当前文章内容,提取出对应的ACF Block,再读取里面的字段。可以用WordPress原生的parse_blocks函数实现,以下是适配你需求的代码示例:
直接替换header.php中的代码
<?php global $post; if (is_singular()) { // 仅在单页面/单文章页面执行 $blocks = parse_blocks($post->post_content); foreach ($blocks as $block) { // 替换成你实际注册的ACF Block名称(注册时的name参数,格式通常为acf/xxx) if ($block['blockName'] === 'acf/block-faq') { $faq_data = $block['attrs']['data']; // 输出字段内容 if (!empty($faq_data['question'])) { echo $faq_data['question']; } if (!empty($faq_data['answer'])) { echo $faq_data['answer']; } } } } ?>
更稳妥的Schema输出方式(推荐在MU插件中添加)
如果你的目标是输出FAQ Schema,建议把逻辑放到wp_head钩子中执行,比直接写在header.php里更灵活:
add_action('wp_head', 'output_faq_schema_from_acf_block'); function output_faq_schema_from_acf_block() { global $post; if (!is_singular() || empty($post)) return; $blocks = parse_blocks($post->post_content); $faq_items = []; foreach ($blocks as $block) { if ($block['blockName'] === 'acf/block-faq') { $data = $block['attrs']['data']; $faq_items[] = [ '@type' => 'Question', 'name' => $data['question'], 'acceptedAnswer' => [ '@type' => 'Answer', 'text' => $data['answer'] ] ]; } } if (!empty($faq_items)) { $schema = [ '@context' => 'https://schema.org', '@type' => 'FAQPage', 'mainEntity' => $faq_items ]; echo '<script type="application/ld+json">' . json_encode($schema) . '</script>'; } }
- 注意事项
- 务必把代码中的
acf/block-faq替换成你注册ACF Block时填写的name参数; - 如果Block内使用了重复字段(Repeater),需要在循环中嵌套处理子字段;
- 确保页面中确实添加了该ACF Block,且字段已填写内容。
- 务必把代码中的
内容的提问来源于stack exchange,提问作者Jemes
相关产品推荐
相关产品推荐

