判断ACF区块模板可用什么函数替代is_page_template?
你的判断是正确的,is_page_template() 仅用于检测WordPress分配给当前文章/页面的顶级页面模板,无法识别嵌套调用的ACF区块模板这类模板部件,所以才会没有输出。下面是适配ACF区块场景的几种可行方案:
方案1:调用时传参识别(最推荐)
直接在调用函数时传入当前区块的标识,无需额外的判断逻辑,性能最高也最易维护。
首先修改functions.php里的函数:
<?php function my_test_function( $block_type = '' ) { if ( $block_type === 'hero' ) { echo '<p>I appear via the hero.php template.</p>'; } if ( $block_type === 'video' ) { echo '<p>I appear via the video.php template.</p>'; } } ?>
对应在不同区块模板里传入参数调用即可:
hero.php 中调用:
<?php my_test_function('hero'); ?>
video.php 中调用:
<?php my_test_function('video'); ?>
方案2:通过ACF全局区块变量判断
如果不想修改调用方式,可以通过ACF渲染区块时生成的全局变量获取当前区块信息:
<?php function my_test_function() { $current_block = $GLOBALS['acf_block'] ?? null; if ( empty($current_block) ) return; // 此处的区块名要和你注册ACF区块时设置的name参数对应,默认前缀为acf/ if ( $current_block['name'] === 'acf/hero' ) { echo '<p>I appear via the hero.php template.</p>'; } if ( $current_block['name'] === 'acf/video' ) { echo '<p>I appear via the video.php template.</p>'; } } ?>
方案3:通过调用栈判断当前模板文件
不需要依赖ACF相关变量,直接通过PHP调用栈获取当前调用的文件路径进行匹配:
<?php function my_test_function() { $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); $current_file = $trace[0]['file'] ?? ''; if ( str_contains( $current_file, 'template-parts/blocks/hero/hero.php' ) ) { echo '<p>I appear via the hero.php template.</p>'; } if ( str_contains( $current_file, 'template-parts/blocks/video/video.php' ) ) { echo '<p>I appear via the video.php template.</p>'; } } ?>
该方案兼容性最高但性能略低,不建议在高频调用的场景下使用。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

