如果您确实想使用include_once
在模板文件中,可以通过缓冲template-loader.php
早期的这样,文件将第一次被包含,模板将作为标准输出。
优点是您可以跟踪模板本身直接包含的内容,而不必保留单独的索引来匹配操作和模板。
add_action(\'init\',\'preload_template_includes\');
function preload_template_includes() {
ob_start();
require_once( ABSPATH . WPINC . \'/template-loader.php\' );
ob_end_clean();
}
注:不确定
init
钩子是最早的,但通常足够了。。。
setup_theme
或
after_setup_theme
还有其他可能性。
EDIT <如果您担心两次加载模板的性能问题,可以在模板顶部添加一些额外的逻辑,在其中运行includes来处理模板本身或其includes的有条件加载。例如:。
// list of relevant includes files
$includes = array(
dirname(__FILE__).\'/template-functions1.php\',
dirname(__FILE__).\'/template-functions2.php\'
);
$included = get_included_files(); $doneincludes = false;
foreach ($includes as $include) {
if (!in_array($include,$included)) {include($include); $doneincludes = true;}
}
if ($doneincludes) {return;}
...the Template itself...
EDIT2 很抱歉,我错过了你想要在插件中实现这一点的机会,以上是主题开发的一种方法。。。尝试以下操作:
add_filter(\'template_include\',\'myplugin_template_preload_check\');
function myplugin_template_preload_check($template) {
global $pluginpreload;
// so is run only the first time
if ( (isset($pluginpreload)) && ($pluginpreload) ) {return;}
$templatefile = basename($template);
$templatefunctions = MYPLUGINDIR.\'/template-functions/\'.$templatefile;
if (file_exists($templatefunctions)) {include($templatefunctions);}
$pluginpreload = true;
// do not actually process the template
return false;
}
add_action(\'init\',\'myplugin_preload_templates\');
function myplugin_preload_templates() {
ob_start();
require_once( ABSPATH . WPINC . \'/template-loader.php\' );
ob_end_clean();
}
通过这种方式,您可以将插件中包含的函数与通过匹配模板名称所使用的模板相匹配。