有选择地为页面或帖子加载插件等

时间:2013-09-16 作者:user2501504

可以选择按页面或帖子加载哪个插件,因为我有35个插件,其中许多插件在许多页面或帖子中都是不必要的,而且只在一些页面上,如何做到这一点?

我已经为此测试了beta插件,但它不能正常工作,我想知道wordpress中是否存在代码来停用我可以用来创建插件的某些页面或帖子中的插件。

1 个回复
SO网友:gmazzap

可以选择通过页面或帖子加载哪个插件[…]?

简短回答: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 MonitorLaps.

另一种方法是,插件通常使用挂钩来完成工作:通过调用一系列add_action / add_filter 将某些行为附加到挂钩上。

通过使用镜面反射remove_action / remove_filter 当您不需要插件时,您可以停止插件执行一些昂贵的操作。这不会阻止WordPress实际需要的插件文件,但按30个插件的顺序排列,这应该不是问题(对于PHP的现代版本,这对性能的影响将非常小)。

结束