この記事は最後に更新してから1年以上経過しています。

プラグインのロード順を制御する

説明

これまでプラグインがどのような順番でロードされるか意識していなかったのだが、とある自作プラグインを他のプラグインよりも先にロードさせたくなったので調べてみた。

プラグインのロードは、コアファイルのトップディレクトリにあるwp-settings.phpで行われている。3.0以降のプラグインは、マルチサイトプラグイン、ネットワークプラグイン、通常のプラグインに分類され、マルチサイト利用している場合は、それに関連したプラグインを優先しているようだ。通常のプラグインについては、 get_option( 'active_plugins', array() )関数にて配列で取得し、その配列内の順番でロードしていることがわかった。配列の中身は、例えば「WP Multibyte Patch」であれば'wp-multibyte-patch/wp-multibyte-patch.php'となっている。

'active_plugins'オプション、基本的には管理画面の「プラグイン」ページにてプラグインの「有効化」および「停止」を行った際に行われている。その保存の前には有効なプラグインのパス名の配列が作られ、パス名で昇順にソートしてから update_option関数で保存されていた。ということは、'active_plugins'オプションに保存されている配列の順番を書き換えれば、プラグインのロード順は制御できるということになる。

2つのpre_update_optionフィルター

update_option関数には、'pre_update_option_'にオプション名を付けたフィルターと、3.9で追加された'pre_update_option'フィルターが用意されている。今回は、オプション名を付けた'pre_update_option_active_plugins'フィルターを利用してみる。プラグイン自身に追記するなら、次のようになる。

add_filter( 'pre_update_option_active_plugins', 'high_priority_active_plugins', 10, 2 );

function high_priority_active_plugins( $active_plugins, $old_value ) {
	$this_plugin = str_replace( wp_normalize_path( WP_PLUGIN_DIR ).'/', '',wp_normalize_path(  __FILE__ ) );
	foreach ( $active_plugins as $no=>$path ) {
		if ( $path == $this_plugin ) {
			unset( $active_plugins[$no] );
			array_unshift( $active_plugins, $this_plugin );
			break;
		}
	}
	return $active_plugins;
}

フィルター関数の第1パラメータは新しく保存する値、第2パラメータは現在保存されている値となる。ここでは第1パラメータのみを使用し、プラグイン自身のパス名を一度配列から削除し、配列の先頭に追加している。プラグイン自身のパス名については、 wp_normalize_path関数を利用してOSのファイルシステムに依存しないようにしてから、「ディレクトリ名/ファイル名」の部分を抜き出している。

あとはプラグインを有効化したままでupdate_option関数を呼び出すか、プラグインを一度「停止」したあとで再度「有効化」すればいい。これでプラグイン自身が最初にロードされるようになる。なお、同じようなことを行っているプラグインを使用している場合は必ずしも最初にはならないので、その場合はフィルター関数の優先度を下げるなどして調整できるだろう。

実際にプラグインのロード順を確認する方法としては、wp-settings.php内の213行目(3.9.1の場合)あたりで変数$pluginの内容をダンプするのが手っ取り早いが、本番環境で行うことはお勧めできない。

ここではプラグイン自身を最初にロードする例だが、応用すれば特定のプラグインの直後やその前にロードするといったことも可能である。プラグインのロード順についてはディレクトリ名でも調整できるが、こういった方法で変更できることは覚えておいて損はないだろう。


最終更新 : 2014年06月09日 17:32


お勧め

determine_locale(2018年12月8日 更新)

string determine_locale()
リクエストに応じたロケールを取得する。

get_oembed_response_data_for_url(2018年12月7日 更新)

object|bool get_oembed_response_data_for_url( string $url, array $args )
URLからoEmbedレスポンスデータを取得する。

current_theme_supports(2018年10月19日 更新)

bool current_theme_supports( string $feature [ , mixed $args ] )
テーマ機能を取得する。

get_permalink(2018年5月27日 更新)

string get_permalink( [ int $id = 0 [ , bool $leavename = false ] ] )
現在の投稿情報(グローバル変数$post)または指定した投稿情報のパーマリンクを取得する。

get_post_permalink(2014年6月12日 更新)

string get_post_permalink( [ int $id = 0 [ , bool $leavename = false [ , bool $sample = false ] ] ] )
カスタム投稿タイプの投稿ページのパーマリンクを取得する。