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

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

説明

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

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

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

関連

お勧めコンテンツ

remove_theme_mods(2012年6月11日 登録)

mixed get_theme_mods( )
現在のテーマ固有のプロパティをすべて削除する。

wp_set_object_terms(2013年1月25日 登録)

mixed wp_set_object_terms( int $object_id, mixed $terms, mixed $taxonomy [ , bool $append = false ] )
投稿情報などにタクソノミーを設定する。

noindex(2010年4月21日 登録)

void noindex( )
noindexメタタグ(<meta name='robots' content='noindex,nofollow' />)を表示する。

wp_trim_words(2011年12月20日 登録)

string wp_trim_words( string $text [ , int $num_words = 55 [ , string $more = null ] ] )
文字列を指定の長さに揃える。

wp_remote_post(2013年6月27日 登録)

mixed wp_remote_post( string $url [ , array $args = array() ] )
POSTメソッドを送信する。

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