我正在编写一个插件,bar,它依赖于另一个被激活的插件,foo,我需要加载来自foo的函数。通常插件是根据目录名按字母顺序加载的,因此在加载之前先加载bar。如果我将bar目录重命名为zbar,那么它会最后加载并正常工作,但我正在寻找一个更优雅和正确的解决方案。
我跟踪了jsdalton\'s method of altering the active_plugins
option, 它正在对数组进行重新排序,以将bar放在末尾,但在实例化时,bar仍然无法访问foo的函数。我已经阅读了相关的核心代码——基本上wp-settings.php
和wp_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