KUSANAGI MAGAZINEで「きもおたわーどぷれす。」が紹介されました! クリックで公式サイトが開きます。

CocoonでjQuery migrateをフッターで読み込む、さらに解除した上で3.0系のエラーを修正して高速化を図る

この記事は約8分で読めます。
記事内に広告が含まれています。

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高速化】PageSpeed Insightsの点数改善方法8選
運営するサイト(Cocoon高速化)の速度改善するため、点数を上げる具体的方法知りたい。 この記事解決できる問題:・適切なサイズの画像・次世代フォーマットでの画...
レンダリングを妨げるリソースの除外について
いつもお世話になっております。 PageSpeed Insightsの改善できる項目でレンダリングを妨げるリソースの除外が指摘されたのですが解決方法はございます...

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解除におけるコードの説明

wp_deregisterで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引数が依存関係の指定です。
つまり、

jqueryは本体(jquery-core)とmigrate(jquery-migrate)の両方と依存関係にあります。

そして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での制御推奨だものね
レベルアップするために頑張って勉強しましょう

というわけで、もしどこか間違ってたらフィードバックお願い!

サイトを始めたい・引っ越したい方へ

おすすめレンタルサーバー「ConoHa WING」
Webサーバー処理速度 国内最速!
サイト管理・カスタマイズのタイパも抜群!
自動化AIのWEXALによって他社より負担を減らせます
各種キャンペーン施策によりコスパも抜群!
ConoHaに初めて入会かつ12か月以上のWINGパックなら
下のボタン経由で契約すると最大5000円の割引が受けられます

この記事を書いた人

素人の備忘録です。
素人がゆえにトラブルにぶつかりまくってきたので、同じように困った方の役に立てたらいいなと思ってます。
8年来のKUSANAGI推し。

元公安調査庁職員、発達障害(ADHD)

天満川 鈴をフォローする
Cocoon
タイトルとURLをコピーしました