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

プラグインのロード順を制御する - 自プラグインを最初にロードさせたい

説明

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

プラグインのロードは、コアファイルのトップディレクトリにある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の内容をダンプするのが手っ取り早いが、本番環境で行うことはお勧めできない。

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

関連

お勧めコンテンツ

get_the_archive_description(2014年12月23日 登録)

string get_the_archive_description()
アーカイブページの説明を取得する。

edit_term_link(2015年6月24日 登録)

string edit_term_link( [ string $link = '' [ , string $before = '' [ , string $after = '' [ , object $term = null [ , bool $echo = true ] ] ] ] ] )
タームの編集リンクを表示または取得する。

get_the_date(2011年4月13日 登録)

mixed get_the_date ( [ string $d = '' [ , mixed $post = null ] ] )
パラメータ$dで指定したフォーマットで投稿日を取得する。

get_the_category(2010年1月3日 登録)

array get_the_category( [ int $id = false ] )
投稿データのカテゴリー情報を取得する。

has_site_icon(2015年8月21日 登録)

bool has_site_icon( [ int $blog_id = 0 ] )
サイトアイコンが設定済みか調べる。

最終更新日時 : 2014-06-09 17:32