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.php
和
header.php
. PHP是一种编程语言,不是一台神奇的机器,在实际包含哪些文件之前,无法知道哪些文件将被包含。