WordPressでスタイルシートを読み込ませる処理どうしてますか?

最終的には、「wp_enqueue_style」で読み込ませるスタイルシートと振る舞いを指定して、「wp_enqueue_scripts」にフックさせてヘッダー内に出力というのが、順等な流れでしょう。

ただ、類似している関数には「wp_register_style」というのがあって、使うのかどうか?これが何をしてるのか?というところで混乱しますね(しない?)。

関数に対する公式ページを見ると、

  • 「wp_register_style」は予めスタイルシートを登録しておくこと
  • 「wp_enqueue_style」は登録されたスタイルシート、または、指定されたスタイルシートをキューに入れること

と書かれています。冒頭で述べたように、最終的にキューに入れないとHTML上に出力されない=適用されることはないですから、「wp_enqueue_style」を使うのは必須なのですが、では「wp_register_style」はどんな時に使うの?となってしまいました(ならない?)。

そこで、あくまでも個人的な興味として、これらの組み込み関数を使った場合、実際にどんな風にキューに入るのか(HTML上に出力されるのか)というのを実際にいろいろな形でコードを追加して検証したのが本ページの内容です。

【結論】「wp_enqueue_style」だけを使えばよい!?

以下のようなことをやってみました。

  1. 「wp_register_style」「wp_enqueue_style」をそれぞれ別のユーザー定義関数で作り、それぞれを「wp_enqueue_scripts」へフックさせて出力
  2. 「wp_register_style」「wp_enqueue_style」を同じユーザー定義関数で作り、それぞれを「wp_enqueue_scripts」へフックさせて出力
  3. 「wp_enqueue_style」だけをユーザー定義関数で作り、それを「wp_enqueue_scripts」へフックさせて出力

今までの私の認識としては、「登録」して「キューに入れる」というイメージだったので、1か2が妥当な線だと考えていたのですが、どのパターンでも「キューに入れる」ことで、処理順に応じてヘッダーの最後部へ出力されるという点は共通だったものの、振る舞いが若干異なることが分かりました。

まとめるとこんな結果になりました。

  • 「wp_register_style」を使った場合には優先度の指定はできない(「wp_enqueue_style」のみ、または両方を1つのユーザー定義関数で使用した場合のみ優先度指定が可能)
  • 優先度を「1」にしても、「wp-emoji-styles」の上までしか移動しない
  • 依存性を指定しても原則反映されない
  • 「wp_enqueue_style」のみで、優先度と依存するIDを指定した場合には、依存するIDごと移動する

スタイルシートによっては、〇〇というIDの直下へ出力させたいというケースや、優先度を「9999」などにしてヘッダーの最後に適用させたいという場合もあるので、それを問題なくできるだけ指示通りに対応させるには以下のようにするという結論に達しました。

  • 基本的にwp_enqueue_styleのみを使えばいい
  • 優先度と同時に依存関係は指定しない

なお、この検証はWordPress6.4.1で、テーマはTT3(Twenty Twenty-Three)の派生テーマ(テーマ名を変えたもの)にfunctions.phpを加えた状態のものを使い、プラグインはすべて停止して行いました。他の条件では違いがあるのかも知れません

よく「wp_register_styleを使うかどうかは好みで」みたいなことが書かれていますが、これは自身の中では正確ではなかったということが分かり、かつ、原則wp_register_scriptは必要ないという認識で結論付けました。

どんなコードでどのように検証したのかについては、以下を展開してご覧ください

詳細な検証結果を見る

標準出力されるスタイルのID順

IDlinkinline
1dashicons
2admin-bar
3wp-block-site-title
4wp-block-navigation-link
5wp-block-navigation
6wp-block-group
7wp-block-post-featured-image
8wp-block-post-title
9wp-block-post-date
10wp-block-paragraph
11wp-block-heading
12wp-block-post-excerpt
13wp-block-table
14wp-block-list
15wp-block-post-template
16wp-block-query-pagination
17wp-emoji-styles
18wp-block-library
19global-styles
20core-block-supports
21wp-block-template-skip-link
22wp-fonts-local

インラインではなく直接出力されてる?

registerとenqueueのユーザー定義関数を分けて検証

優先順等何も指定しない

コード

function test_register_style_init(){
	wp_register_style('ha-test-style',get_theme_file_uri('/test-css.css'),array());
}
add_action('wp_enqueue_scripts','test_register_style_init');

function test_enqueue_style_init(){
	wp_enqueue_style('ha-test-style');
}
add_action('wp_enqueue_scripts','test_enqueue_style_init');

挿入された場所

予想通りenqueueされているもののうちの一番下へ挿入された

21wp-block-template-skip-link
ha-test-style
22wp-fonts-local

enqueue側に優先順を付けてみる

enqueue側に優先度1を付けて変化を見てみました。

コード

function test_register_style_init(){
	wp_register_style('ha-test-style',get_theme_file_uri('/test-css.css'),array());
}
add_action('wp_enqueue_scripts','test_register_style_init');

function test_enqueue_style_init(){
	wp_enqueue_style('ha-test-style');
}
add_action('wp_enqueue_scripts','test_enqueue_style_init',1);

挿入された場所

変化がない、この優先順は全く機能していない

優先順をなくし、enqueue側にarray()指定してみる

enqueue時のフック優先順は全く効いていないので、今度はenqueue側で「global-styles」への依存性を指定してみました

コード

function test_register_style_init(){
	wp_register_style('ha-test-style',get_theme_file_uri('/test-css.css'),array());
}
add_action('wp_enqueue_scripts','test_register_style_init');

function test_enqueue_style_init(){
	wp_enqueue_style('ha-test-style','',array('global-styles'));
}
add_action('wp_enqueue_scripts','test_enqueue_style_init');

挿入された場所

変化なし

優先順をなくし、register側にarray()指定してみる

enqueue時の依存性は全く効いていないので、今度はregister側で「global-styles」への依存性を指定してみました

コード

function test_register_style_init(){
	wp_register_style('ha-test-style',get_theme_file_uri('/test-css.css'),array('global-styles'));
}
add_action('wp_enqueue_scripts','test_register_style_init');

function test_enqueue_style_init(){
	wp_enqueue_style('ha-test-style');
}
add_action('wp_enqueue_scripts','test_enqueue_style_init');

挿入された場所

変化なし

register側に優先順を指定してみる

コード

function test_register_style_init(){
	wp_register_style('ha-test-style',get_theme_file_uri('/test-css.css'));
}
add_action('wp_enqueue_scripts','test_register_style_init',1);

function test_enqueue_style_init(){
	wp_enqueue_style('ha-test-style');
}
add_action('wp_enqueue_scripts','test_enqueue_style_init');

挿入された場所

変化なし


この結果から、wp_register_styleとwp_enqueue_styleを別のユーザー定義関数で処理した場合には、何をどうしてもenqueueされるものの最終へ追加されることが判明した。

registerとenqueueのユーザー定義関数をひとまとめにして検証

次に行ったのが、公式などに書かれているwp_register_styleとwp_enqueue_styleを同じユーザー定義関数の中で処理させた場合。

まずは基本的なコード

コード

function test_register_style_init(){
	wp_register_style('ha-test-style',get_theme_file_uri('/test-css.css'));
	wp_enqueue_style('ha-test-style');
}
add_action('wp_enqueue_scripts','test_register_style_init');

挿入された場所

予想通り、enqueueされるものの一番下へ挿入されました。

優先度を設けてみる

次にフックに優先度「1」を付けてみました。

コード

function test_register_style_init(){
	wp_register_style('ha-test-style',get_theme_file_uri('/test-css.css'));
	wp_enqueue_style('ha-test-style');
}
add_action('wp_enqueue_scripts','test_register_style_init',1);

挿入された場所

16wp-block-query-pagination
ha-test-style
17wp-emoji-styles
18wp-block-library

wp-emoji-stylesの上へ挿入されました(優先度1でもこれ以上上には上がりませんでした)

register側へ依存性を付加してみる

register側へ「global-styles」への依存性を指定してみた

コード

function test_register_style_init(){
	wp_register_style('ha-test-style',get_theme_file_uri('/test-css.css'),array('global-styles'));
	wp_enqueue_style('ha-test-style');
}
add_action('wp_enqueue_scripts','test_register_style_init');

挿入された場所

enqueueされるものの一番下へ挿入されました(依存関係は無視されました)

enqueue側へ依存性を付加してみる

register側へ「global-styles」への依存性を指定してみました

コード

function test_register_style_init(){
	wp_register_style('ha-test-style',get_theme_file_uri('/test-css.css'));
	wp_enqueue_style('ha-test-style','',array('global-styles'));
}
add_action('wp_enqueue_scripts','test_register_style_init');

挿入された場所

enqueueされるものの一番下へ挿入されました(変化なし)

wp_enqueue_styleのみしてみる

最後にregisterを使わずenqueueのみで使用

通常の挿入方法

コード

function test_register_style_init(){
	wp_enqueue_style('ha-test-style',get_theme_file_uri('/test-css.css'));
}
add_action('wp_enqueue_scripts','test_register_style_init');

挿入された場所

enqueueされるものの一番下へ挿入されました

優先度を設定

コード

function test_register_style_init(){
	wp_enqueue_style('ha-test-style',get_theme_file_uri('/test-css.css'));
}
add_action('wp_enqueue_scripts','test_register_style_init',1);

挿入された場所

16wp-block-query-pagination
ha-test-style
17wp-emoji-styles
18wp-block-library

wp-emoji-stylesの上へ挿入されました(優先度1でもここまでしか上に上がらないという結果になりました)

依存性を付加

「global-styles」への依存性を指定してみました

コード

function test_register_style_init(){
	wp_enqueue_style('ha-test-style',get_theme_file_uri('/test-css.css'),array('global-styles'));
}
add_action('wp_enqueue_scripts','test_register_style_init');

挿入された場所

enqueueされるものの一番下へ挿入されたままでした(つまり依存性が効いていない状態でした)

依存性と優先度の両方を付加

優先度を指定したまま「global-styles」への依存性を指定してみました。

コード

function test_register_style_init(){
	wp_enqueue_style('ha-test-style',get_theme_file_uri('/test-css.css'),array('global-styles'));
}
add_action('wp_enqueue_scripts','test_register_style_init',1);

挿入された場所

19global-styles
ha-test-style
17wp-emoji-styles
18wp-block-library
20core-block-supports
21wp-block-template-skip-link

global-stylesごと先頭に移動してしまって、おかしなことになりました。この方法では標準の読み込み順自体が変わってしまうので不都合が出る可能性が高いことが分かりました。