有没有一个钩子或函数可以用来显示当前页面上正在使用的所有主题文件?

时间:2014-11-11 作者:RachieVee

基本上,我希望能够在前端看到文件的名称-不仅仅是模板,例如类别/页面模板,而是实际的主题文件,例如标题。php/侧栏。php/页脚。php等等。

因此,我认为问题在于,我发现目前为止的内容没有我所需要的深度,只是告诉我使用了什么样的“模板”,而不是组成“模板”的所有部分。

我似乎找不到可以为我提供PHP对象的东西var_dump 看看有什么可用的或我可以操纵的钩子。这是真的存在还是我在抓救命稻草?

What I looked into so far:

  • How do you find out which template is serving the current page?

    t31os的回答很有帮助,但它只能深入到containertemplate,所以如果我在header中调用他的函数。php,它会告诉mepage。php而不是标头。php。换句话说,我想知道调用函数的确切文件。

  • Get Name of Current Template File

    这是一个与第一个问题类似的问题,仍然使用t310s的答案作为参考。

    也调查了wp_get_theme 函数,但该对象仅向我提供有关主题本身的信息,而不是数组或文件列表。

    我的目标是编写一个函数,可以动态地回显前端正在查看的所有文件名或片段。所以一个“页面”会回应页面。php,侧栏。php,页脚。php和标题。例如php。

    请不要插件,我想用PHP解决这个问题。我知道这可能不是一个简单的答案,但我希望至少有一个起点,或者至少知道这是否可行。

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

PHP有一个函数,get_included_files(), 返回请求期间包含的所有文件。

但是,如果使用该函数,则可以获得all 所需文件:WordPress核心文件、插件文件。。。

您需要一种方法来:

  • 过滤掉不属于主题和子主题的文件(如果有)
  • 只包括主模板包含后加载的文件
而且您需要尽可能晚地调用此函数;shutdown 是个更好的钩子,wp_footer 应该没问题,因为很少在启动挂钩后包含文件。

关于上述两个问题,第一个问题可以通过过滤数组中只属于主题文件夹的文件来解决。

第二个问题可以通过使用template_include, 以非常低的优先级,保存主模板的路径,然后在输出中只包含它后面包含的文件。

这里有一个实现上述内容的类。放入文件并要求functions.php:

class IncludedPartGrabber
{    
    private $main;
    private $root;
    private $switch = false;

    public function setup( $template )
    {
        $this->root = wp_normalize_path( get_theme_root() ); // theme folder
        $this->main = wp_normalize_path( $template ); // main template

        return $template;
    }

    public function grab()
    {
        return array_filter( get_included_files(), array( $this, \'filter\' ) );
    }

    private function filter( $file )
    {
        $norm =  wp_normalize_path( $file );
        if ( $norm === $this->main )
            $this->switch = TRUE; // after main template all files are good to be included

        return $this->switch && strpos( $norm, $this->root ) === 0; // true if file is in theme dir
    }
}
在你的functions.php:

$grabber = new IncludedPartGrabber;

add_action( \'template_include\', array( $grabber, \'setup\' ) );

add_action( \'wp_footer\', function() use($grabber) {
    echo \'<pre>\';
    print_r( $grabber->grab() ); // see your footer :)
    echo \'</pre>\';
} );
如果要在模板文件中使用,请在中functions.php 放置:

global $grabber;
$grabber = new IncludedPartGrabber;

add_action( \'template_include\', array( $grabber, \'setup\' ) );
然后在模板文件中,例如。footer.php:

<pre><?php print_r( $GLOBALS[\'grabber\']->grab() ); ?></pre>
当然你可以用在header.php 也是,但从该文件中,您将只获得当前加载的文件header.php 已包括在内,例如。page.phpheader.php. PHP是一种编程语言,不是一台神奇的机器,在实际包含哪些文件之前,无法知道哪些文件将被包含。

SO网友:Milo

get_header, get_footer, 和get_sidebar 所有操作都有相应的操作,这些操作将名称作为参数传递,因此您可以钩住这些操作,通过locate_template 并记录姓名。

get_template_part 有一个动作,但它是动态的,包括弹头,所以除非你知道弹头,否则很难钩住。你能做的就是胡克all, 字符串匹配动作的第一部分,get_template_part_, 这正是what this What the File plugin does:

add_action( \'all\', \'save_template_parts\', 1, 3 );

function save_template_parts( $tag, $slug = null, $name = null ) {
    if ( 0 !== strpos( $tag, \'get_template_part_\' ) ) {
        return;
    }

    // Check if slug is set
    if ( $slug != null ) {

        // Templates array
        $templates = array();

        // Add possible template part to array
        if ( $name != null ) {
            $templates[] = "{$slug}-{$name}.php";
        }

        // Add possible template part to array
        $templates[] = "{$slug}.php";

        // Get the correct template part
        $template_part = str_replace( get_template_directory() . \'/\', \'\', locate_template( $templates ) );
        $template_part = str_replace( get_stylesheet_directory() . \'/\', \'\', $template_part );

        // Add template part if found
        if ( $template_part != \'\' ) {
            // log $template_part
        }
    }

}

SO网友:Jonas Lundman

Play along with:

echo \'<ul><li>\'.implode(\'</li><li>\', str_replace(str_replace(\'\\\\\', \'/\', ABSPATH).\'wp-content/\', \'\', array_slice(str_replace(\'\\\\\', \'/\', get_included_files()), (array_search(str_replace(\'\\\\\', \'/\', ABSPATH).\'wp-includes/template-loader.php\', str_replace(\'\\\\\', \'/\', get_included_files())) + 1)))).\'</li></ul>\';
包含当前登录页使用的所有模板文件的HTML列表,包括插件中的所有模板部分、子主题和/或父主题组合,所有这些都在一行代码中。

写于:

How do you find out which template page is serving the current page?

如果admin-bar stuff 路径显示在顶部,或任何其他文件,请更改文件名template-loader.php 在这一行代码中,输入:无论您需要从哪个filname中断。

如果你在管理栏中需要这个,use the right priotity (最早)to make shure no files are entered at the end 此列表的。例如:

add_action(\'admin_bar_menu\', \'my_adminbar_template_monitor\', -5);
优先级-5 先加载舒尔。关键是在正确的时刻渲染这条线。

如果您的服务器使用双斜杠,请进行一些更改。

结束

相关推荐

需要通过Functions.Php注销脚本

嗯,我有点失望Wordpress注销脚本有多么困难。首先,我得到了所有句柄的列表,所以我查找了它,句柄是jquery migrate然后我将其添加到我的函数中。phpwp_dequeue_script(\'jquery-migrate\'); 还有这个wp_dequeue_script(\'jquery\'); 尽管脚本已正确注册,但它什么也不做。版本字符串出了什么问题,我想不出为什么它们仍然包含这些字符串,应该尽快在下一个WP版本中删除,它们只会在某些情况下阻止缓存正确缓存,这很烦人