如何才能看到正在调用哪些模板部件来呈现可查看的页面?

时间:2014-06-22 作者:user658182

我有一个主题,开发人员经常使用get\\u tempalate\\u part(),这些部分分散在主题子目录以及为辅助主题而创建的插件目录中。

下面是我用来理解所调用的主模板(父模板,缺少更好的词)的代码:

add_action(\'wp_head\', \'show_template\');
function show_template() {
    global $template;
    print_r($template);
}

show_template();
这很好,但它只显示父模板文件的位置。我可以使用什么代码从模板部件中找出调用的内容和位置?

4 个回复
SO网友:TBI Infotech

可以使用查看模板零件get_template_part($slug)这是WordPress内部隐藏的宝石之一,没有得到应有的关注。这个get_template_part 函数本质上是一个PHP包含或需要的函数:

它已经知道您的主题所在的位置,并将在该主题的目录中查找请求的文件

如果请求的文件不存在,它不会发出警告或致命输出

如果找不到请求的文件,它可以搜索其他合适的文件

它了解子主题和父主题

长话短说,get\\u template\\u part功能允许您将主题分解为更小的模板(或模板部分),这些模板可以在其他模板中重用。

例如:

get_template_part( \'navigation\', get_post_type() );
在哪里get_post_type() 将返回当前显示的帖子类型的名称,因此如果我们在帖子上,它将尝试加载导航帖子。php和回退到导航。php。如果我们在一个页面上,导航页面。php和导航。php。如果我们正在查看一个自定义的帖子类型,比如一本书,它将查找导航书。php并返回到导航。php。

get\\u template\\u part的真正功能来自一个名为locate_template, 它在父主题和子主题文件夹中执行整个搜索,并恢复到堆栈中的其他模板。这个get_template_part 函数只需为locate_template 寻找。下面是一个简单的例子:

get_template_part( \'one\', \'two\' );
创建一个由“one-two.php”和“one.php”(按特定顺序)组成的数组,并将其传递给locate_template, 然后遍历该数组并在子主题和父主题目录中查找文件。顺序在这里非常重要,这就是为什么文件名优先于它们的位置(父主题或子主题),并解释了查找顺序背后的原因。

还值得注意的是get_header, get_sidebarget_footer 非常类似于get_template_part 使用某种硬编码的第一个参数。

get_template_part 位于wp includes/general模板中。php和locate_template 在wp includes/模板中。php。

SO网友:Jonas Lundman

使用这一行,在页脚的后面。php:

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>\';
写于:

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 先加载舒尔。关键是在正确的时刻渲染这条线。

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

更多信息,请访问:How do you find out which template page is serving the current page?

SO网友:Christoph Daum

一种简单的方法是向每个模板文件添加一些echo。喜欢<!--folder/filename.php-->

最好将其包装在if-so中,它仅在调试期间显示。

SO网友:keesiemeijer

如果您查看get_tempalate_part() 你将看到你可以参与到行动中get_template_part_{$slug}". 作为变量$slug 是未知的,您必须从模板文件本身获取变量。

下一个示例使用过滤器获取当前页面使用的主题模板文件template_include. 然后使用tokenizer 要从get_template_part() 文件中的函数。已知的弹头get_template_part_{$slug} 操作用于获取模板路径。模板路径打印在主题的页脚中。

Note: 用于get_template_part() 主题模板文件中需要有一个字符串。如果主题使用另一种方法将参数添加到函数中(变量、常量等),则不会找到slug(因此也不会找到路径)。不要在生产中使用此示例。

Display_Get_Template_Part_Path_In_Footer::on_load();

class Display_Get_Template_Part_Path_In_Footer {

    static $templates = array();

    public static function on_load() {
        add_filter( \'template_include\',  array( __CLASS__, \'read_theme_template\' ), 99 );
        add_action( \'wp_footer\', array( __CLASS__, \'wp_footer\' ), 100 );
    }

    public static function wp_footer() {
        // print templates in footer
        if ( !empty( self::$templates ) ) {
            echo \'<pre>\';
            print_r( array_unique( self::$templates ) );
            echo \'</pre>\';
        } else {
            echo "<p>no get_template_part() found</p>";
        }
    }

    public static function read_theme_template( $template ) {

        $tokens = token_get_all( file_get_contents( $template ) );

        foreach ( $tokens as $index => $token ) {

            $name = is_array( $token ) ? token_name( $token[0] ): \'\';
            $value = is_array( $token ) ? $token[1] : $token;

            if ( !( ( \'T_STRING\' ===  $name ) && ( \'get_template_part\' === $value ) ) ) {
                continue;
            }

            // function name \'get_template_part\' found, get next tokens
            $next = isset( $tokens[ $index + 1 ] ) ? $tokens[ $index + 1 ] : \'\';
            $next_id = isset( $tokens[ $index + 1 ][0] ) ? $tokens[ $index + 1 ][0] : \'\';
            $second_next = isset( $tokens[ $index + 2 ] ) ? $tokens[ $index + 2 ] : \'\';

            if ( \'(\' === $next || ( T_WHITESPACE === $next_id ) && ( \'(\' === $second_next ) ) {

                $slug = self::get_template_slug( $tokens, $index+1 );
                if ( !empty( $slug ) ) {
                    add_action( "get_template_part_{$slug}", array( __CLASS__, \'get_template_part\' ), 15, 2 );
                }
            }
        }

        return $template;
    }

    // get\'s first T_CONSTANT_ENCAPSED_STRING ($slug argument)
    public static function get_template_slug( $tokens, $index ) {

        $slug = \'\';
        $brackets = 0;
        $function_tokens = array_slice( $tokens, $index );

        foreach ( $function_tokens as $key => $token ) {

            $name = isset( $token[0] ) ? token_name( $token[0] ) : \'\';

            if ( $token === \'(\' ) {
                ++$brackets;
                continue;
            }

            if ( $brackets === 0 ) {
                continue;
            }

            if ( ( ( $token === \')\' ) && ( --$brackets === 0 ) ) || ( \',\' === $token ) ) {
                break;
            }

            if ( ( \'T_CONSTANT_ENCAPSED_STRING\' === $name ) ) {
                $slug = sanitize_title( $token[1] );
                break;
            }
        }

        return $slug;
    }

    // function copied from WP Core (returns template path)
    public static function get_template_part( $slug, $name = null ) {
        $templates = array();
        $name = (string) $name;
        if ( \'\' !== $name )
            $templates[] = "{$slug}-{$name}.php";

        $templates[] = "{$slug}.php";

        // get template without loading the file
        self::$templates[] = locate_template( $templates, false, false );
    }

}

结束

相关推荐

1 post, 2 templates

我想能够呈现两种不同的风格(2个模板)后。例如,假设我有post ID 133,我希望有两个url来访问它,因此它会呈现不同模板应用的位置。洛雷姆。com/render1/133。com/render2/1333,例如。。。或者可能是这样的:洛雷姆。com/post/133和lorem。com/post/133?模板=2您将如何操作?