CocoonデフォルトだとPageSpeed Insightsから「レンダリングを妨げるリソースの除外」を指摘されます。
具体的には「jQuery」と「jQuery migrate」。
本稿では2つの方法にて、この問題への対処をします。
jQuery migrateとは?
ざっくり言うと、
jQuery旧バージョンとの互換性を保つためのプラグインです
うっかり読み込みを停止すると、
○○がエラーになって動かない!
と叫ぶ羽目になります。
しかしWordPress5.5でjQuery migrateが廃止されます。
そのせいで本当に「動かない!」と叫ぶ悲劇があちこちで発生してしまいました。
これを踏まえて、以下に対処法を記します。
対処法1 jQuery本体とmigrateをフッターで読み込ませる
かような状況からmigrateの読み込みを停止するのは怖いという方もいるでしょう。
またjQuery本体は必ず読み込ませないといけません。
そこで両方ともフッターで読み込ませることで対処します。
次の記述を子テーマのfunctions.phpに加えます。
/* jQuery&migrate遅延*/ if ( !function_exists( 'is_footer_javascript_enable' ) ): function is_footer_javascript_enable(){ return true;//get_theme_option(OP_FOOTER_JAVASCRIPT_ENABLE, 1); } endif;
これでPageSpeed Insightsはクリアできます(検証済)。
参考記事はこの2つ。
何をやっているかは、こちらをお読みください。
Cocoonにはフッター読み込みオプションをつけていたものを、後に削除したらしく。
作者わいひら氏は同オプションにつき、上記記事で以下の通り説明しています。
その機能は、不具合が出てしまうプラグインが結構あったので、廃止しました。
やっぱり高速化も大事ですが、正しくコンテンツが表示される方がより大事なので。
対処法2 jQuery migrateの読み込みを解除する
コード
migrate無しでも動くなら、余計なものは読み込まない方がいいわけです。
そこで今度はjQuery migrateを外すことにします。
次のコードを子テーマのfunctions.phpに記述します。
/* jquerymigrate停止*/ function jq_enqueue_scripts(){ //管理画面以外 if ( ! is_admin() ) { //一旦、全て解除 wp_deregister_script('jquery'); wp_deregister_script('jquery-core'); wp_deregister_script('jquery-migrate'); //一本化 wp_enqueue_script('jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js', array(),'2.2.4', true); } } add_action( 'wp_enqueue_scripts', 'jq_enqueue_scripts' );
Cocoonのデフォルト状態だとjQuery3.0以上ではエラーが出るので2.2.4にしています。
jQuery3.0系以上を使いたい場合およびエラー修正
jQuery3.0系が使いたい場合は、まず前項のコードの以下の部分を差し替えてください。
wp_enqueue_script('jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js', array(),'3.6.0', true); }
さらに親テーマのJavaScript.jsの編集をします。
174行目あたりの記述を以下のコードと差し替えてください。
//モバイルヘッダーメニューのロゴ処理 //console.log($('.mobile-menu-buttons')); $('.mobile-menu-buttons').each(function(){ if ($(this).has('.logo-menu-button').length) { $(this).addClass('has-logo-button'); } }); $(window).on('load',function(){ $('#carousel').addClass('loaded'); });
エラーの原因は、loadが3.0系以上で非推奨のためです。
該当箇所はこの行(修正前)。
$(window).load(function(){
書き換えたところエラーが出なくなりました。
ただし親テーマ更新のたびに書き換える必要はあります。
JavaScript.jsの中身を子テーマにまるっとコピペして親テーマのJavaScript.jsの読み込みを停止する方法はあります。
しかし他のアップデートが入った時に対処できなくなりますので、現状は親テーマ書換えでよろしいかと。
スキンがエラーを生じさせる場合もある
スキンによっては3.6.0系だとmigrateを外したときエラーが生じます
例えばイノセンススキン。
恐らくコード書換えで対応できると思います。
migrate解除におけるコードの説明
それだとテーマのjavascript.jsを読み込まなくなっちゃうの……
親テーマにおけるjQuery読み込みコードはlib/utils.phpにあります。
該当箇所はこちら。
//jQueryファイルの読み込み if ( !function_exists( 'wp_enqueue_script_jquery_js' ) ): function wp_enqueue_script_jquery_js(){ wp_deregister_script('jquery'); wp_deregister_script('jquery-core'); wp_deregister_script('jquery-migrate'); $ver = get_jquery_version(); $in_footer = is_footer_javascript_enable() ? true : false; wp_register_script('jquery', false, array('jquery-core', 'jquery-migrate'), get_jquery_core_full_version($ver), $in_footer); //jQueryの読み込み wp_enqueue_script('jquery-core', get_jquery_core_url($ver), array(), get_jquery_core_full_version($ver), $in_footer); //jQuery Migrateの読み込み $ver = get_jquery_migrate_version(); wp_enqueue_script('jquery-migrate', get_jquery_migrate_url($ver), array(), get_jquery_migrate_full_version($ver), $in_footer); } endif;
御覧いただきたいのはこの行。
wp_register_script('jquery', false, array('jquery-core', 'jquery-migrate'), get_jquery_core_full_version($ver), $in_footer);
第3引数が依存関係の指定です。
つまり、
そしてjavascript.jsはjqueryと依存関係にあります。
親テーマの場合ですとこちら。
wp_enqueue_script( THEME_JS, THEME_JS_URL, array( 'jquery' ), false, true );
第三引数がjqueryとなっている通りです。
先に説明した通り、jqueryはcoreとmigrateの両方と依存関係にあります。
つまり両方を読み込まないとjavascript.jsを読み込まない仕組になっています。
これを解消するため、
「core+migrate=jquery」だったものを一旦リセットして「core=jquery」に変更したわけです
wp_enqueue_script()の構造は以下の通り。
wp_enqueue_script('ハンドル名', 'ファイル元', 依存関係,'バージョン名', フッター読み込み);
先述のコードと見比べていただければ、何を入れればいいかわかると思います。
まとめ
実はfunctions.phpでスクリプトを制御するの今回が初めて
今まではテンプレートに直打ちしてたし
WordPressではfunctions.phpでの制御推奨だものね
レベルアップするために頑張って勉強しましょう
というわけで、もしどこか間違ってたらフィードバックお願い!