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

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

説明

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

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

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

関連

お勧めコンテンツ

stripslashes_from_strings_only(2015年12月12日 登録)

mixed stripslashes_from_strings_only( mixed $value )
文字列のスラッシュを取り除く。

the_guid(2010年12月24日 登録)

void the_guid( [ mixed $id = 0 ] )
GUIDを表示する。

convert_invalid_entities(2015年8月24日 登録)

string convert_invalid_entities( string $content )
コンテントに含まれる無効なHTMLエンティティを変換する。

wp_set_post_tags(2012年7月5日 登録)

mixed wp_set_post_tags( [ int $post_id = 0 [ , string $tags = '' [ , bool $append = false ] ] ] )
投稿情報に投稿タグを設定する。

is_tax(2011年8月31日 登録)

bool is_tax( [ mixed $taxonomy = '' [ , mixed $term = '' ] ] )
カテゴリーおよび投稿タグ以外のタクソノミーアーカイブページか調べる。

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