检查是否从header.php或footer.php中调用了部分文件

时间:2016-05-30 作者:Boris Kozarac

我将部分文件包括在header.php 并且在footer.php 具有get_template_part(\'content-form\');

是否有if 子句可以用来检查从何处调用文件?如果从内部调用footer.php, 然后我想添加一个类名。

<div class="default-class <?php if (called_from_footer) echo \'footer-class\'; ?>">
</div>
如果没有更好的解决方案,我可以这样做并相应地设计样式,我只是好奇:

<div class=footer-container">
    <?php get_template_part(\'content-form\') ;?>
</div>

4 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

这并不是您问题的真正解决方案(检查哪个模板加载了另一个模板),但它可以用来测试页脚是否已加载,从而测试它是否正在加载您的部分:

if ( did_action( \'get_footer\' ) ) echo \'footer-class\';

SO网友:Ismail

有很多很好的解决方案可以做到这一点,您应该遵循cjbj在评论中提供的链接。

我建议使用PHP的debug_backtrace() 功能:

function wpse_228223_verify_caller_file( $file_name, $files = array(), $dir = \'\' ) {

    if( empty( $files ) ) {
        $files = debug_backtrace();
    }

    if( ! $dir ) {
        $dir = get_stylesheet_directory() . \'/\';
    }

    $dir = str_replace( "/", "\\\\", $dir );
    $caller_theme_file = array();

    foreach( $files as $file ) {
        if( false !== mb_strpos($file[\'file\'], $dir) ) {
            $caller_theme_file[] = $file[\'file\'];
        }
    }

    if( $file_name ) {
        return in_array( $dir . $file_name, $caller_theme_file );
    }

    return;

}
用法:

在您的content-form 模板,在第一个参数中传递文件名:

echo var_dump( wpse_228223_verify_caller_file( \'header.php\' ) ); // called from header
echo var_dump( wpse_228223_verify_caller_file( \'footer.php\' ) ); // called from footer
您可以在模板中添加适当的类名。。

请先做几个测试。我测试的方式很好。因为您正在创建自己的自定义模板,除非您调用它,否则默认情况下不会调用它,所以应该可以正常工作。

SO网友:gmazzap

老实说,我认为解决你的具体问题的最好办法是the one form @TheDeadMedic.

它可能有点“脆弱”,因为do_action(\'get_footer\') 可以在任何文件中完成。。。但在WordPress中什么不是脆弱的呢?

一种仅用于“学术目的”的替代解决方案是使用PHPget_included_files() 正在检查footer.php 需要:

function themeFileRequired($file) {

    $paths = array(
        wp_normalize_path(get_stylesheet_directory().\'/\'.$file.\'.php\'),
        wp_normalize_path(get_template_directory().\'/\'.$file.\'.php\'),
    );

    $included = array_map(\'wp_normalize_path\', get_included_files());

    $intersect = array_intersect($paths, $included);

    return ! empty($intersect);
}
然后:

<div class="default-class <?= if (themeFileRequired(\'footer\') echo \'footer-class\'; ?>">
</div>

SO网友:cjbj

如果你真的想让它变快变脏,只需要使用一个全局变量(嘿,WP一直都在这么做,为什么你不能呢?)。在通话前设置,然后阅读。像这样:

在里面functions.php: global $contentform_origin = \'\';

在里面header.php: $contentform_origin = \'header\'; get_template_part(\'content-form\');

在里面footer.php: $contentform_origin = \'footer\'; get_template_part(\'content-form\');

在里面content-form.php: <div class="default-class <?php echo $contentform_origin ?>-class"> </div>

别忘了申报$contentform_origin 在每个php文件的开头。

相关推荐