ブログ内検索

テック

コピペで完了!WordPressでスクリプトにdefer・async・moduleを付ける方法

wordpress-enqueue-scripts-cover.avif

どうも久しぶりに自分のサイト(WordPress)をいじくり始めたこうじです。

さて、最近のフロントエンドでは、JavaScriptをbodyの最後で読み込む時代ではなくなりました。(多分)

スクリプトはできるだけ早く読み込みを開始し、asyncやdeferを使って非同期で処理を終わらせるのが基本です。

さらにES Modulesを使うのであれば、type="module"も必要になります。

しかし、WordPressで開発していると、

こうじ
こうじ
エンキューしたスクリプトに”module”を付けたい・・・

なんて思ったことありますよね。きっとあるはずです。

・・・あるよね?^^;

で、いざ「やろう!」って思っても、意外と方法が分かりにくいんですよね。

この記事では、そんな紳士淑女の皆様方に、WordPressの正しいスクリプト読み込み方法と
defer / async / module を付与する方法を紹介します。

こうじ
こうじ
コピペで使えるよ!(たぶん)

よくやりがちなNGコード

時間がない時とか、納期5分前とかによくやってしまいがちなやり方がこれ。

html
<script src="<?php echo get_template_directory_uri(); ?>/js/script.js"></script>

テンプレートに直接<script />タグを書く方法です。

もちろんこれでもスクリプトは読み込めます。
しかしこの方法には問題があります。

  • WordPress側でスクリプトの依存関係を管理できない

  • 読み込み順序の制御ができない

  • プラグインとの競合が起きやすい

そのため、WordPressでは必ず「スクリプトはエンキューして読み込む」のが基本になります。

正しいスクリプトファイルの読み込み方

まずはWordPress標準の方法でスクリプトをエンキューします。
ファイルはどこでもいいんですが、とりあえずfunctions.phpにでも書いておきますか。

functions.php php
function theme_enqueue_scripts() {
    wp_enqueue_script(
        'theme-script',
        get_template_directory_uri() . '/js/script.js',
        [],
        null,
        true
    );
}

add_action('wp_enqueue_scripts', 'theme_enqueue_scripts');

各パラメーターの意味

パラメーター 意味
theme-script スクリプトのハンドル名(ユニーク名称)
URL 読み込むJSファイルのパス
[] 依存スクリプト。入れたハンドル名の後に追加されるようになります。
null バージョン
true trueにするとフッターで読み込みされます

WordPressでは この方法で読み込むのが基本です。

async / defer を付ける方法

WordPress6.3以降では、Script Loading Strategies(スクリプト戦略) が使用できます。

例えば次のようにするとエンキューしたスクリプトファイルにdeferが付きます。
asyncにしたい場合はdeferの部分を書き換えてください。

php
function theme_enqueue_scripts() {
    wp_enqueue_script(
        'theme-script',
        get_template_directory_uri() . '/js/script.js',
        [],
        null,
        [
            'strategy' => 'defer',
            'in_footer' => false, // <head />でさっさと読み込む。省略可
        ]
    );
}

add_action('wp_enqueue_scripts', 'theme_enqueue_scripts');

出力例

html
<script defer src="/path/to/scripts.js" id="theme-script-js"></script>

module を付ける方法

ES Modules を使う場合はtype="module"を付ける必要があります。

しかし、先ほどのstrategyの方法は使えないので、moduleをつける場合はscript_loader_tagフィルターを使用してゴリ押しします。

php
function theme_enqueue_scripts() {
    wp_enqueue_script(
        'theme-script',
        get_template_directory_uri() . '/js/script.js',
        [],
        null,
        false,
    );

    // スクリプトタグを直接書き換える
    add_filter('script_loader_tag', function ( $tag, $handle, $src) {
        if ('theme-script' !== $handle) {
            return $tag;
        }

        // type="module" を注入する
        return str_replace('<script ', '<script type="module" ', $tag);
    }, 10, 3 );
}

add_action('wp_enqueue_scripts', 'theme_enqueue_scripts');

出力されるHTMLはこうなります。

html
<script type="module" src="/path/to/script.js" id="theme-script-js"></script>

WordPress 6.5以上の場合はもっとシンプル

6.5以上の場合はwp_enqueue_script_moduleが使えるので、置き換え処理をすることなく追加できます。コードもシンプル!

php
function theme_enqueue_module_scripts(): void {
    wp_enqueue_script_module(
        'theme-script',
        get_template_directory_uri() . '/js/script.js',
        [],
        null,
    );
}

add_action('wp_enqueue_scripts', 'theme_enqueue_module_scripts');

まとめ

WordPressでは、自由度が高い為下手に「ラク」を取ろうとすると、とりあえず動けばよかろうコードを書いてしまったり、何でもかんでもテンプレートに直書き(管理画面とは一体!?)コードを書いてしまいがちです。

しかし、その「とりあえず」が積み重なるとあとから修正するときにとんでもない負債になります。

せっかくWordPressにはエンキューという仕組みが用意されているので、正しく使ってモダンなスクリプト読み込みを実装していきましょうね!

こうじ
こうじ
次はViteを実装したい。

関連記事

timestamps-converter-cover.avif

「このUNIXタイムスタンプいつ?」をサクッと解決!Mac開発者のための快適設定

Python+シェルスクリプトでUNIXタイムスタンプ(秒/ミリ秒)を即変換。

apple-emacs-shortcut-cover.avif

Macユーザーに捧ぐ!日常が変わるEmacs風ショートカット厳選まとめ

Macの標準機能で利用できるEmacsキーバインドを使って日常のテキスト入力などを効率化!

adobe-graduation-ceremony-cover.avif

【Adobe卒業式】年間10万円の節約!AdobeからApple Creator Studioに乗り換えた話

高額なAdobe税から卒業!解約の違約金トラップや、解約前にやるべき事などを解説。

vim-believer-cover.avif

爆速コーディングを実現するVimを布教する記事【入門編】

俺選!実務で爆速化する神コマンドを厳選して布教します。

timemachine-to-mac-transfer-cover.avif

意外と簡単!Time MachineでMac環境をお引越し(M1→M5)

Time MachineでMacを移行したらほぼそのまま復元できた話。

vite-first-guide-cover.avif

「アナタ無しでは生きられない!」Viteを使って今スグ爆速の開発環境を整えよ!

保存した瞬間にブラウザが更新されるViteの「ホットリロード」を活用した爆速開発環境を作る手順を解説!

jetstream-profile-image-cover.avif

Jetstream(Laravel)でプロフィール画像が表示されない会場はこちらです

Jetstreamで画像が保存・表示されない原因をケースごとにまとめました。

cloud-document-cover.avif

使ってみたいよね?Adobeクラウドドキュメントを試してみた

Adobeクラウドドキュメントを試して感じたメリットとデメリットをまとめました。

lv-sl-error-cover.avif

Laravelでstorageの画像が表示されない件

Webアプリ(Laravel)をサーバー移動した際に画像が表示されなかった場合の備忘録です。

railx6sj-cover.avif

ssh接続エラー: Too many authentication failuresをどうにかする

SSH接続時に出現する「Too many authentication failures」のエラーの解決法についてご紹介。

kusanagi-sever-error-cover.avif

KUSANAGIでサイトが表示されない場合は初心にかえる

KUSANAGIサーバーでどうやっても希望のドメインがサイトから見れなかった場合に試してたい選択肢をご紹介。

kusanagi-laravel-cover.avif

「爆速KUSANAGI」に『爆速Laravel』をインストール

爆速WordPressで人気の高いKUSANAGIサーバーに、Laravelをインストールし、爆速で使って見ようという事になりました。


新着記事一覧

kindle-comic.png

無料で漫画を一気読み!Kindleで出産レポ・育児漫画などなど

timestamps-converter-cover.avif

「このUNIXタイムスタンプいつ?」をサクッと解決!Mac開発者のための快適設定

Python+シェルスクリプトでUNIXタイムスタンプ(秒/ミリ秒)を即変換。

apple-emacs-shortcut-cover.avif

Macユーザーに捧ぐ!日常が変わるEmacs風ショートカット厳選まとめ

Macの標準機能で利用できるEmacsキーバインドを使って日常のテキスト入力などを効率化!

adobe-graduation-ceremony-cover.avif

【Adobe卒業式】年間10万円の節約!AdobeからApple Creator Studioに乗り換えた話

高額なAdobe税から卒業!解約の違約金トラップや、解約前にやるべき事などを解説。

vim-believer-cover.avif

爆速コーディングを実現するVimを布教する記事【入門編】

俺選!実務で爆速化する神コマンドを厳選して布教します。

timemachine-to-mac-transfer-cover.avif

意外と簡単!Time MachineでMac環境をお引越し(M1→M5)

Time MachineでMacを移行したらほぼそのまま復元できた話。

apple-fitness-plus-cover.avif

体重乱高下アラフォーがApple Fitness+に行き着いた話

激しい体重の増減を繰り返したチョコザップユーザーが、コスパ最強の「Apple Fitness+」に乗り換えました。

vite-first-guide-cover.avif

「アナタ無しでは生きられない!」Viteを使って今スグ爆速の開発環境を整えよ!

保存した瞬間にブラウザが更新されるViteの「ホットリロード」を活用した爆速開発環境を作る手順を解説!

with-pomodoro-technique-cover.avif

「私のコトですか?」過集中&注意力散漫な人に刺さる!効率化ではなく“生存戦略”のポモドーロ術

集中力が「0か200」しかない人に朗報!ポモドーロ・テクニックが脳の暴走を止める最強の特効薬でした。

jetstream-profile-image-cover.avif

Jetstream(Laravel)でプロフィール画像が表示されない会場はこちらです

Jetstreamで画像が保存・表示されない原因をケースごとにまとめました。

cloud-document-cover.avif

使ってみたいよね?Adobeクラウドドキュメントを試してみた

Adobeクラウドドキュメントを試して感じたメリットとデメリットをまとめました。

lv-sl-error-cover.avif

Laravelでstorageの画像が表示されない件

Webアプリ(Laravel)をサーバー移動した際に画像が表示されなかった場合の備忘録です。