私はプラグインを書いています、bar、これは別のプラグインに依存しています、foo、活性化されています、そして私はfooがbarloadsの時に利用可能です)通常プラグインはディレクトリ名に基づいてアルファベット順にロードされるので、barはfooの前にロードされます。私がbarディレクトリをzbarにリネームする)なら最後にロードされます)うまくいきますが、もっとエレガントで正しい解決策を探しています。
私は jsdaltonのactive_plugins
オプション を変更する方法に従い、最後にbarを配置するように配列を並べ替えていますが、barはまだfoo'にアクセスできない)関連するコアコード - 基本的にはwp-settings.php
内のwp-includes\load.php
とwp_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
ロード順に触れないで、代わりにアクティブ化順を変更してください。実用的な例は この答え にあります。
とにかく、あなたのbarのコンストラクタは、あなたのコードの中でアクションが呼ばれる前にいつも走るでしょう。
私はしばらく前にこのシナリオに遭遇しました、そして、あなたは私がそれをした方法のためにほとんどそこにいます。
単に置く - this_plugin_last関数内のすべてをコメントアウトして、あなたの$ bar = new bar();そこにあります。そしてすべてのロジックを実行し、その関数に必要なことをすべて追加してください。これにより、コードを実行する前にfooが確実にロードされます(プラグイン自体は必ずしも事前にロードする必要はなく、使用するものはfooに依存します)。
依存するプラグインコードの先頭、プラグイン名、説明などの下に次の行を追加します。
require_once( WP_PLUGIN_DIR . '/foo/foo.php' );
"foo"プラグインはコードを見つけるために "bar"のためにアクティブにされる必要さえありません。