问题描述
我正在编写一个插件,bar,它取决于另一个插件,foo,被激活,并且我需要从 foo 的功能在 bar 加载时可用。通常根据目录名称按字母顺序加载插件,所以 bar 在 foo 之前加载。如果我将 bar 目录重命名为 zbar,那么它最后被加载并且工作正常,但是我正在寻找一个更加优雅和正确的解决方案。
我遵循了 jsdalton 的改变 active_plugins
选项的方法,并且重新排序数组以在最后放置条,但是在实例化时,bar 仍然无法访问 foo 的功能。我已经阅读了相关的核心代码 – 基本上是 wp-settings.php
和 wp-includesload.php
中的 wp_get_active_and_valid_plugins()
,而且它似乎是按照 active_plugins
索引的顺序加载插件,所以我无法弄清楚出了什么问题。
这是在 MultiSite 安装。酒吧是一个课程,foo 是程序性的。
这是一个 stripped-down 版本的 foo /foo.php
function foo()
{
// stuff
}
这是一个 stripped-down 版本的 bar /bar.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();
这是 bar 的构造函数的输出:
Array
(
[0] => foo/foo.php
[1] => bar/bar.php
)
foo doesn't exist yet
最佳解决方案
不要触摸加载顺序,改变激活顺序。一个工作实例可以在 this answer 中找到。
次佳解决方案
无论什么,您的构造函数将始终在代码中调用操作之前运行。
我曾经遇到过这种情况,你们大多是在那里做的。
简单的说 – 把 this_plugin_last 功能里面的一切注释掉,并把你的 $ bar = new bar(); 里面有并且只需在该函数中执行所需的所有逻辑和所需要的内容。这样可以确保在运行代码之前加载 foo(插件本身并不一定需要在手之前加载,而是依赖于 foo 使用的) 。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。