您如何找出哪个模板页面正在为当前页面提供服务?


54

激活wordpress主题时,找出要更改的文件总是很麻烦。任何想法如何简化事情?

但另一方面,考虑到get_template_part功能,这可能是不可能的。你说什么?


1
我检查html并找到一个已识别的标签或独特的标签。
Naoise Golden 2011年

1
查看源代码,并查找可以告诉您使用哪个模板的主体类。还为您提供了ID
Brad Dalton 2014年


@BradDalton +1。特别是在不允许我们安装插件或编写函数以实现目标的情况下。
Subrata Sarkar

Answers:


34

勾上template_include,设置一个全局变量以记下主题设置的模板,然后将该值读回页脚或页眉以查看给定视图正在调用哪个模板。

我之前在“ 获取当前模板文件的名称”中谈到了此过滤器钩子,但是请获取该代码副本并对其进行主题处理functions.php

然后打开主题的header.phpfooter.php(或任意位置),然后使用类似以下的内容打印当前模板。

<div><strong>Current template:</strong> <?php get_current_template( true ); ?></div>

如果要在生产站点上使用此功能,并使该信息远离非管理员用户,请添加一些条件逻辑。

<?php 
// If the current user can manage options(ie. an admin)
if( current_user_can( 'manage_options' ) ) 
    // Print the saved global 
    printf( '<div><strong>Current template:</strong> %s</div>', get_current_template() ); 
?>

现在,您可以跟踪正在使用哪种模板的视图,同时使该信息远离访问者。


1
如果此答案有问题,或者任何人都可以对可以改善此答案的方法提出意见,请在此提出评论,并分享您对如何改善它的想法和想法。
t31os

1
它不起作用,它说“未定义的功能”
卢卡斯·布斯塔曼特

1
@LucasB同样,这是我遇到的错误
林肯·伯根森


40

好吧,如果您要做的只是检查已使用哪个模板文件来生成当前页面,那么您就不需要弄脏代码了;)

有一个方便的插件,称为Debug Bar 在包括您在内的许多情况下,它都是很好的帮助者。您绝对应该检查一下-对我和许多其他人来说,它是任何WP开发的必备伴侣。

我已经附上了一张截图,可以让您坠入爱河...

在此处输入图片说明

要使调试栏正常工作,您需要启用wp_debugwp_savequeries选项。这些选项默认情况下处于禁用状态。

不过,在进行任何更改之前,请记住以下几点:

  • 除非网站不能满足大量流量,否则请勿在生产环境中进行操作。
  • 完成调试后,请确保禁用网站的选项(尤其是wp_savequeries选项,因为它会影响性能)。

进行更改:

  1. wp_config.php通过ftp客户端打开文件。
  2. 搜索wp_debug选项。修改为define( 'WP_DEBUG', true );。如果该行不存在,请将其添加到文件中。
  3. 同样,将行编辑或添加define( 'SAVEQUERIES', true );到文件中。
  4. 救。您已准备好进行调试。

更多信息:Codex


2
@justCallMeBiru-调试栏插件不需要 WP_DEBUGSAVEQUERIES,尽管它们对此进行了增强
Pat J

3
运行这样的插件,仅需要一点点信息,就会创建大量开销的恕我直言,因此这就是为什么我没有在自己的答案中建议它的原因。就是说,很明显人们喜欢这个答案,我很好奇为什么会这样。
t31os 2014年

23

我使用此方便的功能仅显示超级管理员的当前模板:

function show_template() {
    if( is_super_admin() ){
        global $template;
        print_r($template);
    } 
}
add_action('wp_footer', 'show_template');

希望能有所帮助。:)


2
这是转到答案,应该接受。
Hybrid Web Dev

12

在每个相关模板文件的get_header行之后添加以下代码:

<!-- <?php echo basename( __FILE__ ); ?> -->

在浏览器>查看源代码中,模板名称将在html代码中显示为注释,例如

<!-- page.php -->

将其添加到任何地方都需要付出很大的努力
Adal

4

我发现最简单的方法是在body标签上包括WordPress功能。它将根据您正在查看的页面(首页显示首页,页面显示页面等)添加几个类。

在此处查看:http : //codex.wordpress.org/Function_Reference/body_class

另外,对于在这些页面上使用CSS定位元素很有帮助。

了解David R提到的模板层次结构(http://codex.wordpress.org/Template_Hierarchy)也是一个好主意。



3

我做的一件非常简单的事情是在主题的每个相关文件中插入HTML注释,以标识模板文件,例如,在我拥有的index.php顶部

<!-- index -->

并在front-page.php的顶部

<!-- front -->

但这显然需要修改主题。我怀疑您可以在footer.php文件或header.php文件中添加自定义函数,该函数将告诉您正在使用的文件。我倾向于使用上面的方法和参考表http://codex.wordpress.org/Template_Hierarchy



3

干得好:

一个HTML列表,其中包含当前着陆页正在使用的所有模板文件,包括来自插件,子主题和/或父主题组合的所有模板部分,所有这些都在一行代码中:

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>';

您可能需要检查您的服务器在任何路径下都不会返回双斜杠。请记住将其放置在实际使用的所有模板文件之后,例如footer.php中,但在管理栏渲染之前

如果admin-bar stuff路径显示在顶部或任何其他文件中,请template-loader.php将此代码行中的文件名更改为:您需要中断的任何filname。经常:class-wp-admin-bar.php

如果需要在管理栏中进行此操作,请使用正确的优先级(最早)确保此列表末尾没有输入文件。例如:

add_action('admin_bar_menu', 'my_adminbar_template_monitor', -5);

优先-5确保先加载。关键是get_included_files()在适当的时候打电话,否则需要弹出数组!

分解:

没有PHP回溯,您将无法收集所有包含的模板文件。内部的超级球星template_include 不会全部收集它们。另一种方法是在每个模板文件中“放置标记”,但是如果您需要首先与文件进行交互,那么您会为时间和整个想法感到困惑。

1)我们需要检查当前Wordpress请求已使用的所有文件。他们很多!如果在注册functions.php之前使用300个文件,不要感到惊讶。

$included_files = str_replace('\\', '/', get_included_files());

我们正在使用PHP本机的get_included_files(),将反斜杠转换为正斜杠以匹配大多数Wordpress返回路径。

2)我们从注册template-loader.php的地方切下该数组。之后,填充的get_included_files()应该只填充模板文件。

/* The magic point, we need to find its position in the array */
$path = str_replace('\\', '/', ABSPATH);
$key = $path.'wp-includes/template-loader.php';
$offset = array_search($key, $included_files);

/* Get rid of the magic point itself in the new created array */
$offset = ($offset + 1);
$output = array_slice($included_files, $offset);

3)缩短结果,直到主题文件夹或插件文件夹(使用中的模板)可以与插件,主题或子主题文件夹混合使用,我们才需要路径。

$replacement = $path.'wp-content/';
$output = str_replace($replacement, '', $output);

4)最后,从数组转换为漂亮的HTML列表

$output = '<ul><li>'.implode('</li><li>', $output).'</li></ul>';

如果您希望插件包含要求,则可能需要在part3) -replacement中进行最后修改。他们可能会在模板输出处理期间调用较晚,并进行“拦截”。class-files

但是,我发现让它们可见是合理的,因为它的想法是跟踪已加载的内容,即使不是在此阶段呈现输出的“模板”也是如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.