加载/需要特定页面/模板/帖子类型的特定php文件

时间:2016-08-02 作者:eddr

我有一个带有多个php文件的插件。我只想在加载特定模板文件时加载其中的一些文件。我不想加载所有内容。

目前,我正在使用add\\u action(\'wp\',\'load\\u files\')进行操作,但这意味着没有执行其他php文件中定义的操作。有什么想法吗?

编辑:似乎有一些解决方法,通过从url获取id,如下所示What's the earliest point I can get the queried object ID?

我仍然不知道是否有任何选项可以从WP功能中工作,因为这种方式不是我首选的方式

2 个回复
SO网友:majick

如果您确实想使用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_themeafter_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();
}
通过这种方式,您可以将插件中包含的函数与通过匹配模板名称所使用的模板相匹配。

SO网友:Rarst

我认为您在文件包含的不同目的上有点混淆,这些目的在现代PHP开发中通常是分开的:定义和运行时代码。

包含定义(如类和函数)的文件应not 包含运行时(立即执行)代码。这使得它们可以安全地早期(在适当的PHP堆栈中进行相当优化的操作,操作码缓存更是如此)或延迟(类自动加载)。

运行时代码引导在WordPress上下文中,通常按以下方式错开运行时代码:

扩展加载后,立即将逻辑挂接到init 胡克(hook)就这些(针对更具体的需求有一些变化)init 钩子激发,您的逻辑进一步将必要的操作钩住到适当的钩子

他们的作用应限于加载过程,并应使用适当的事件系统处理进一步的操作(WP情况下的挂钩)。