【WordPress】wp_footerでJavaScriptファイルを読み込んで、サイト表示を高速化しよう

【WordPress】wp_footerでJavaScriptファイルを読み込んで、サイト表示を高速化しよう

サイト表示に重要な高速化。WordPressではサイトの表示時間が重くなりがちですよね。
なかなかサイトが表示されないとユーザはページから離脱してしまい、機会ロスにも繋がります。

一番の原因はWordPress自体の動作が遅かったりしますが、
ブラウザ側での1つの原因として、外部JavaScriptファイルの読み込みによる、レンダリングブロックが挙げられます。
JavaScriptファイルを読み込んでいる最中は、ブラウザのページ表示が一時的に止まるため、その分表示に時間がかかってしまいます。

ページの表示は、早ければ早いほど良いものです。
今回はブラウザのレンダリングブロック回避に有効な、スクリプトの配置方法をご紹介します。

body閉じタグ直前でJavaScriptファイルを読み込む

JavaScriptファイルのレンダリングブロック問題で、一般的な対処方法は
headタグ内でファイルを読み込むのではなく、bodyの閉じタグ直前でファイルを読み込むのが効果的です。


        <script src="js/jquery.js"></script>
        <script src="js/script.js"></script>

    </body>
</html>

headタグ内で読み込んでしまうと、ページ内容を読み込む前にレンダリングブロックが発生してしまうので、
サイトに訪れたユーザは画面が真っ白な状態で待たされることになります。

scriptタグはheadタグ以外にも、bodyタグ内であればどこでも配置できるので、
ページの最後で読み込むことで、ページの読み込みが速く感じさせることができるのです。

wp_footer内にscriptタグを配置する

WordPressでも同じことをすることで、ブラウザのレンダリングブロックを回避します。
テーマのbody閉じタグの直前にscriptタグを配置しましょう。


        <?php wp_footer(); ?>

        <script src="path/to/jquery.js"></script>
        <script src="path/to/script.js"></script>

    </body>
</html>

と言いたいところですが、

これだとクソですね全然イケてないです

もし、</body> が複数のファイルで記述されているとしましょう。
しかし、jQueryはサイト全体で読み込みたい。
個別のファイル一つ一つに記述していたのでは、とても管理が面倒です。
また、ケアレスミスも起きやすい。

できれば wp_footer の中で出力できれば、きれいなコードを保てます。

となれば、次に wp_footer でscriptタグを出力する方法をご紹介します。

wp_footerでscriptタグを出力するには

wp_footer でscriptタグを出力するには、functions.phpに出力させる処理を追加する必要があります。
おおまかな流れは2つで、JSファイルの追加処理の定義と、wp_footerへの登録です。

functions.php

<?php

// JSファイル追加の関数
function my_load_widget_scripts() {
    // Twitterウィジェット用のJSの読み込み
    wp_enqueue_script('widgets_js', '//platform.twitter.com/widgets.js', array());
    // はてブボタン用のJSを読み込み
    wp_enqueue_script('hatebu', 'http://b.st-hatena.com/js/bookmark_button.js', array());
}

// wp_footerに処理を登録
add_action('wp_footer', 'my_load_widget_scripts');

add_action('wp_footer', 関数名) で、wp_footerへの出力登録をします。

注目すべきは、my_load_widget_scripts 内で使用している、 wp_enque_scripts という関数です。

wp_enqueue_script でscriptタグを出力する

wp_enqueue_script は、scriptタグを出力します。
WordPressで推奨されているscriptタグの出力方法です。

<?php wp_enqueue_script( $handle, $src, $deps, $ver, $in_footer ); ?>

$handle

スクリプトを識別するための名称。初期値はなし。

$src

スクリプトのURLを指定。初期値は false
jQueryやjQuery UIなどの WordPress に含まれ登録されているデフォルトスクリプトを指定することも可能。

$deps

このスクリプトより前に読み込まれる必要があるスクリプトを指定。初期値は array()

$ver

scriptタグのクエリストリングとしてファイルパスの最後に連結される、スクリプトのバージョン番号を指定。初期値は false

スクリプトは通常 HTMLの headタグ内に置かれるが、もしこのパラメータが true の場合 body終了タグの前に配置される。 初期値は false

add_action('wp_footer', 関数名)wp_footer に出力設定する場合は、$in_footer のフラグは必要ありません。

実際の出力結果を見てみましょう。


        <script type='text/javascript' src='//platform.twitter.com/widgets.js?ver=4.5.3'></script>
        <script type='text/javascript' src='http://b.st-hatena.com/js/bookmark_button.js?ver=4.5.3'></script>

    </body>
</html>

やりました、出力できました。

ん。

いや、ちょっと待ってください

はてブボタンのscriptタグにasync属性が無いじゃないですか。
実は wp_enqueue_script には属性を追加するAPIがありません

最後の仕上げに async属性を追加する方法を紹介しましょう。

script_tag_loaderでタグの属性を追加する

async属性の説明は省きますが、HTMLに属性を追加できないと、柔軟性に欠けます。

WordPressでは wp_enqueue_script を実行するタイミングで、処理を実行する仕組みがあります。

それが、script_loader_tag です。

<?php

// ハンドル名 hatebu の wp_enqueue_script に async 属性を追加する。
function my_addasync_hatebu_enqueue_script( $tag, $handle ) {
    if ( 'hatebu' !== $handle ) { return $tag; }
    return str_replace( ' src', ' async="async" src', $tag );
}

// スクリプト出力時に処理
add_filter( 'script_loader_tag', 'my_addasync_hatebu_enqueue_script', 10, 2 );

この script_loader_tag は、scriptタグを文字列として扱うことができます。
そのため、str_replace でasync属性を追加することが出来ます。

<?php
    str_replace( ' src', ' async="async" src', $tag );

ここにきて文字列置換というのが、なんとも低レイヤーな対応なんですが、これが一番スマートなやり方だと思います。

では出力結果を見てみましょう。


        <script type='text/javascript' src='//platform.twitter.com/widgets.js?ver=4.5.3'></script>
        <script type='text/javascript' async="async" src='http://b.st-hatena.com/js/bookmark_button.js?ver=4.5.3'></script>

    </body>
</html>

よーし、満足だ!

wp_footerは便利

いかがでしたでしょうか。
wp_footerを使いこなすことで高速化を手助けすることが出来ます。

特に、SNSボタンの外部JSの読み込みをwp_footerで行うことで、
高速化&使いまわしができるコードになります。
テーマを作成するときにも重宝すると思いますよ!

SNSボタン設置は次の記事が参考になるので、あわせて読むことをおすすめします。

五十川 洋平(Yohei Isokawa)

五十川 洋平(Yohei Isokawa)

フロントエンドエンジニア/面白法人カヤックなどのWeb制作会社に勤務したのち、故郷の新潟に戻り独立。JSフレームワークAngularやFirebase、Google Cloud Platformを使ったWebアプリ開発が得意。 また、Udemyのプログラミング解説の講師、writer.appの自主開発や上越TechMeetupの主催などを行っています。

プロフィール

©Copyright 2022 Yohei Isokawa All Rights Reserved.