如何在特定ACF块启用时用PHP为body标签添加onload事件
实现仅当页面包含特定ACF块时为body添加onload属性
你的需求是只有当页面用到带Google Map的ACF块时,才给<body>标签加上onload="initialize()"属性,下面是修正后的可行方案,同时解释下你原代码失效的原因:
修正后的完整代码
1. 正确检测ACF块是否存在(支持嵌套块)
ACF块的blockName格式是acf/[你的块slug],比如你块的slug是google-map,那对应名称就是acf/google-map。下面的函数会检测顶层和嵌套的目标块:
function has_acf_block($block_slug) { $post = get_post(); // 先判断是否存在文章内容,以及是否包含块 if (!$post || !has_blocks($post->post_content)) { return false; } $blocks = parse_blocks($post->post_content); $target_block = 'acf/' . $block_slug; foreach ($blocks as $block) { // 检查当前顶层块 if ($block['blockName'] === $target_block) { return true; } // 检查嵌套的子块 if (!empty($block['innerBlocks'])) { foreach ($block['innerBlocks'] as $inner_block) { if ($inner_block['blockName'] === $target_block) { return true; } } } } return false; }
2. 给body添加onload属性
使用WordPress的body_attr钩子(5.8及以上版本支持)来修改body标签的属性:
function add_map_onload_to_body($attrs) { // 替换成你的ACF块slug,比如'google-map' if (has_acf_block('google-map')) { $attrs['onload'] = 'initialize()'; } return $attrs; } add_filter('body_attr', 'add_map_onload_to_body');
兼容旧版WordPress的方案
如果你的WordPress版本低于5.8,body_attr钩子不存在,可以改用wp_body_open钩子添加初始化脚本,效果和onload属性一致:
function load_map_initialization_script() { if (has_acf_block('google-map')) { echo '<script>window.addEventListener("load", initialize);</script>'; } } add_action('wp_body_open', 'load_map_initialization_script');
原代码失效的原因
- 未处理嵌套块:如果你的ACF块被放在其他块(比如列块、组块)里面,原函数只会遍历顶层块,找不到目标块。
- blockName格式错误:你传入的
block_handle可能没带acf/前缀,ACF块的名称默认是acf/[slug],单纯传slug会匹配失败。 - 未判断$post是否存在:在非单页(比如归档、404页面),
get_post()会返回null,导致函数直接报错或返回false。
内容的提问来源于stack exchange,提问作者Wayne Goodman
相关产品推荐
相关产品推荐

