it-swarm-ja.com

プラグインのロード順序を変更する

私はプラグインを書いています、bar、これは別のプラグインに依存しています、foo、活性化されています、そして私はfoobarloadsの時に利用可能です)通常プラグインはディレクトリ名に基づいてアルファベット順にロードされるので、barfooの前にロードされます。私がbarディレクトリをzbarにリネームする)なら最後にロードされます)うまくいきますが、もっとエレガントで正しい解決策を探しています。

私は jsdaltonのactive_pluginsオプション を変更する方法に従い、最後にbarを配置するように配列を並べ替えていますが、barはまだfoo'にアクセスできない)関連するコアコード - 基本的にはwp-settings.php内のwp-includes\load.phpwp_get_active_and_valid_plugins()を読んだことがあるので、プラグインはactive_plugins内でインデックス付けされている順序でロードする必要があるため、わかりません何がおかしいのですか。

これはMultiSiteインストールにあります。 barはクラス、fooは手続き型です。

これはfoo/foo.phpの省略版)です。

function foo()
{
    // stuff
}

そしてこれが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
6
Ian Dunn

ロード順に触れないで、代わりにアクティブ化順を変更してください。実用的な例は この答え にあります。

2
fuxia

とにかく、あなたのbarのコンストラクタは、あなたのコードの中でアクションが呼ばれる前にいつも走るでしょう。

私はしばらく前にこのシナリオに遭遇しました、そして、あなたは私がそれをした方法のためにほとんどそこにいます。

単に置く - this_plugin_last関数内のすべてをコメントアウトして、あなたの$ bar = new bar();そこにあります。そしてすべてのロジックを実行し、その関数に必要なことをすべて追加してください。これにより、コードを実行する前にfooが確実にロードされます(プラグイン自体は必ずしも事前にロードする必要はなく、使用するものはfooに依存します)。

5
Mike

依存するプラグインコードの先頭、プラグイン名、説明などの下に次の行を追加します。

require_once( WP_PLUGIN_DIR . '/foo/foo.php' );

"foo"プラグインはコードを見つけるために "bar"のためにアクティブにされる必要さえありません。

1
danblaker