Changing Plugin Load Order

时间:2011-05-13 作者:Ian Dunn

我正在编写一个插件,bar,它依赖于另一个被激活的插件,foo,我需要加载来自foo的函数。通常插件是根据目录名按字母顺序加载的,因此在加载之前先加载bar。如果我将bar目录重命名为zbar,那么它会最后加载并正常工作,但我正在寻找一个更优雅和正确的解决方案。

我跟踪了jsdalton\'s method of altering the active_plugins option, 它正在对数组进行重新排序,以将bar放在末尾,但在实例化时,bar仍然无法访问foo的函数。我已经阅读了相关的核心代码——基本上wp-settings.phpwp_get_active_and_valid_plugins() 在里面wp-includes\\load.php -- 看起来插件应该按照索引的顺序加载active_plugins, 所以我不知道出了什么问题。

这是一个多站点安装bar是一个类,foo是程序性的。

这是一个精简版的foo/foo。php

function foo()
{
    // stuff
}
这是一个精简版的酒吧/酒吧。php

class bar
{
    public function __construct()
    {
        // ...

        $active_plugins = get_option(\'active_plugins\');
        print_r($active_plugins);

        if( function_exists(\'foo\') )
            wp_die("foo exists");
        else
            wp_die("foo doesn\'t exist yet");
        }
    }
}

function this_plugin_last() 
{
    $wp_path_to_this_file = preg_replace(\'/(.*)plugins\\/(.*)$/\', WP_PLUGIN_DIR."/$2", __FILE__);
    $this_plugin = plugin_basename(trim($wp_path_to_this_file));
    $active_plugins = get_option(\'active_plugins\');
    $this_plugin_key = array_search($this_plugin, $active_plugins);

    if ($this_plugin_key) 
    {
        array_splice($active_plugins, $this_plugin_key, 1);
        array_push($active_plugins, $this_plugin);
        update_option(\'active_plugins\', $active_plugins);
    }
}
add_action("plugins_loaded", "this_plugin_last");

$bar = new bar();
这是条形图构造器的输出:

Array
(
    [0] => foo/foo.php
    [1] => bar/bar.php
)

foo doesn\'t exist yet

3 个回复
最合适的回答,由SO网友:fuxia 整理而成

不要触摸加载顺序,而是更改激活顺序。可以在中找到一个工作示例this answer.

SO网友:Mike

无论如何,在代码中调用操作之前,您的bar构造函数将始终运行。

我不久前遇到过这种情况,你主要是因为我是如何做到的。

只需在这个plugin\\u最后一个函数中注释掉所有内容,然后放入您的$bar=new bar();在里面。只需在该函数中执行所有需要的逻辑和其他操作。这可以确保在运行代码之前加载foo(插件本身不一定需要事先加载,只需要使用依赖于foo的内容)。

SO网友:danblaker

在依赖插件代码的顶部,插件名称、描述等的下方添加以下内容:

require_once( WP_PLUGIN_DIR . \'/foo/foo.php\' );
“foo”插件甚至不需要激活“bar”来查找代码。

结束

相关推荐

Multisite behind Varnish

我正在尝试将varnish与wp 3.0.5网站(Multisite)一起使用,当我访问varnish URL时,我收到以下消息:Multisite only works without the port number in the URL. 我是否需要自定义VCL来实现此功能?我正在为其他工作正常的wordpress站点使用相同的后端配置。。如果我需要在serverfault上询问此问题,请告诉我,我会在那里询问。