この記事は最後に更新してから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


お勧め

get_next_image_link(2021年7月25日 更新)

string get_next_image_link( [ string | int[] $size = 'thumbnail' [ , string | false $text = false ] ] )
次の添付ファイルへのリンクを取得する。

wp_after_insert_post(2020年12月11日 更新)

void wp_after_insert_post( int | WP_Post $post, bool $update, WP_Post $post_before )
投稿情報を保存した後にアクションを実行する。

wp_save_post_revision(2024年1月10日 更新)

int | WP_Error | void wp_save_post_revision( int $post_id )
現状の投稿のリビジョンを作成する。

wp_debug_backtrace_summary(2012年6月15日 更新)

mixed wp_debug_backtrace_summary( [ string $ignore_class = null [ , int $skip_frames = 0 [ , bool $pretty = true ] ] ] )
デバッグ用の呼び出し情報を取得する。

nocache_headers(2018年5月27日 更新)

void nocache_headers( )
ブラウザのキャッシュを無効にするHTTPヘッダーを出力する。