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

判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:36:03