问题描述

我正在编写一个插件,bar,它取决于另一个插件,foo,被激活,并且我需要从 foo 的功能在 bar 加载时可用。通常根据目录名称按字母顺序加载插件,所以 bar 在 foo 之前加载。如果我将 bar 目录重命名为 zbar,那么它最后被加载并且工作正常,但是我正在寻找一个更加优雅和正确的解决方案。

我遵循了 jsdalton 的改变 active_plugins 选项的方法,并且重新排序数组以在最后放置条,但是在实例化时,bar 仍然无法访问 foo 的功能。我已经阅读了相关的核心代码 – 基本上是 wp-settings.phpwp-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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。