问题描述

我试图找出一些机制来加载插件,根据页面的 url,以提高性能。

我的主要关注点是,我在用户在页面上处于活动状态时,会有一些重复出现的 admin-ajax.php 调用。我尝试对这些调用进行了分析,发现大多数为 ajax 调用加载的插件是不必要的。

虽然我可以使用 is_admin()来识别 ajax 调用,但我希望 WordPress 和插件代码保持不变。此外,is_admin()不区分 ajax 调用和管理面板。

我一直在研究插件加载过程。我只看到'muplugins_loaded''plugins_loaded'动作,没有过滤器进入加载过程。我检查了 wp_get_active_and_valid_plugins,显然更改插件加载的唯一方法是 update_option('active_plugins'),这不是一个可行的选择。其他东西都是硬编码的。

(我想提到这个插件 http://wordpress.org/extend/plugins/selective-loading/使用 update_option 方法,这在我看来只适用于 non-ajax 环境,否则选项更改不会是原子的。)

我想知道是否还有一些方法来实现选择性插件加载?

最佳解决方案

过滤 option_active_plugins 。您可以在此处更改 get_option()的结果,而无需实际更改数据库。

if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
    add_filter( 'option_active_plugins', 'disable_plugins_temporary' );

function disable_plugins_temporary( $plugins )
{
    // unset plugins you don't need, then

    return $plugins;
}

Background

wp_get_active_and_valid_plugins()调用 get_option( 'active_plugins', array() )获取活动插件。在 get_option( $option, $default = false )中,我们发现这个过滤器:

return apply_filters( 'option_' . $option, maybe_unserialize( $value ) );

所以我们的过滤器的结果名称是 option_active_plugins

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。