可以选择通过页面或帖子加载哪个插件[…]?
简短回答:Not with a plugin (nor with code in a theme).
通常,在WordPress中,您使用条件标记来确定您在哪个帖子或页面中,例如,您可以使用is_page(\'my-page\')
或is_post(12)
等等
问题是,在解析当前url的查询后,这些条件标记就可用了,当这种情况发生时,所有插件和主题都已加载,因此没有机会(目前WordPress中没有时间机器API)。
即使您直接查看请求url(而不是通过条件标记查询),也无法确保您的插件在其打算禁用的插件之前运行。
唯一可能的解决方案是使用MU plugin, 它查看请求url并有选择地禁用插件。这是可能的,因为MU插件是在常规插件之前加载的。
为此,您可以筛选\'option_active_plugins\'
. 更改的结果get_option()
, 如本节所述@toscho answer.
因此,创建一个MU插件,并在其中放入如下内容(代码只是示例):
<?php
add_filter( \'option_active_plugins\', \'enable_plugins_selectively\' );
function enable_plugins_selectively( $plugins ) {
$current_page = add_query_arg( array() );
switch ($current_page) {
case \'/\' : // enable specific plugins for home page
$plugins = array(
\'plugin_dir/plugin_file.php\',
\'third_plugin_dir/third_plugin_file.php\',
);
break;
case \'/a-page/\' : // enable specific plugins for this page
$plugins = array(
\'plugin_dir/plugin_file.php\',
\'third_plugin_dir/third_plugin_file.php\',
);
break;
case \'/2013/09/hello-world/\' : // disable specific plugin for this post
if (array_key_exists(\'plugin_dir/plugin_file.php\', $plugins) ) {
unset( $plugins[ array_search(\'plugin_dir/plugin_file.php\', $plugins) ] );
}
break;
}
return $plugins;
}
即使可以使用正则表达式检查一些URL,也应该问问自己是否值得这么麻烦:所有这些硬编码的URL都很难维护。
理解问题,不要假设插件会减慢页面加载,最好的办法是进行一些测试,并有效地查看性能影响。有一些通用的PHP工具,甚至WordPress插件,比如Query Monitor 或Laps.
另一种方法是,插件通常使用挂钩来完成工作:通过调用一系列add_action
/ add_filter
将某些行为附加到挂钩上。
通过使用镜面反射remove_action
/ remove_filter
当您不需要插件时,您可以停止插件执行一些昂贵的操作。这不会阻止WordPress实际需要的插件文件,但按30个插件的顺序排列,这应该不是问题(对于PHP的现代版本,这对性能的影响将非常小)。