Simplicityの特徴 › フォーラム › テーマファイルのカスタマイズに関する質問など › jqueryの読み込みをフッターでやりたい
-
投稿者投稿
-
-
2015年7月24日 6:28 PM #29859
Nyu
ゲストPageSpeed Insightsの点数を更に上昇させるため、jqueryの読み込みをヘッダーではなくフッターで行いたいと思っています。
スクロールせずに見えるコンテンツのレンダリングをブロックしている JavaScript/CSS を排除する
レンダリングをブロックする JavaScript を除去してください:
http://secret-love.info/wp-includes/js/jquery/jquery.js
http://secret-love.info/…includes/js/jquery/jquery-migrate.min.js子テーマを使用してカスタマイズしているのですが、その場合、どこをどう書きかえればよろしいのでしょうか?
-
2015年7月24日 7:47 PM #29868
Hidekichi
ゲスト子テーマfunctions.phpで、wp_deregister_script()にて、現在登録されているjqueryを解除して、新たにwp_register_script()にて、5つ目の引数をtrueにしたらfooter付近で読み込みます。
が、jqueryをfooterで読み込むと、プラグイン等でjquery依存のスクリプトが、たいていは大丈夫かと思いますがheaderで読み込まれたりして、jqueryが無いぜってエラーを吐くことがあったりします。そうすると、javascript.js等のスクリプトがそのエラー部分で停止してしまって、SNSのカウントが読めなかったり、トップへ戻るが機能しなかったり、追従サイドバーが動作しないなどの不具合が出る場合があります。
これは避けないとダメなので、jQueryはヘッダで読み込む方が安全といえば安全です。
基本的に、レンダリングブロックを避けるのであれば、deferかasyncを入れる方が良いかと思います。
deferは遅延ですが、何の遅延かと言いますと、htmlの解析ができたら(まぁ準備ができたら)後で読み込むと言うようなものです。asyncは非同期に読み込めるようになったら読み込むと言う感じです。どちらもレンダリングブロックを邪魔するものではありません。僕は基本的にwordpress自前のjqueryではなく、GoogleのCDNからjQueryを読み込ませているので、jqueryを解除、新たに登録していますが、先ほどの理由通り、たまにヘッダで読み込むプラグイン等の影響でエラーが出ることがあるためjQueryはヘッダで読み込ませています。
また、add_filterでscript_loader_tagを利用して、jQueryのsrc部分をasync defer srcに置換して非同期で読み込ませています。概要としては Simplicityを少し改造してみた 番外編 part5 スクリプトのレンダリングブロックを解消する にてどうぞ。
実際には、もう少し違うことをしているんですけれども、意味合いはこんな感じです。
-
2015年7月24日 10:08 PM #29875
Nyu
ゲストHidekichiさん、すごく丁寧な解説をしてくださりどうもありがとうございます。
教えていただいたことを試しにやってみましたが、仰る通りSNSのカウントが正常に取得出来ませんでした。
しかし、既存のjsファイルの位置を変更するというテクニックは知りませんでしたので、非常に勉強になりました。どうもありがとうございました!
-
2015年7月24日 10:39 PM #29883
Hidekichi
ゲスト自分のやつを晒してみます。
function file_check($address){ $ch = curl_init(); // 初期化 curl_setopt( $ch, CURLOPT_URL, $address ); // URLの設定 curl_setopt( $ch, CURLOPT_HEADER, true); curl_setopt( $ch, CURLOPT_NOBODY, true); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // 出力内容を受け取る設定 curl_setopt($ch, CURLOPT_TIMEOUT, 15); $r = curl_exec( $ch ); // データの取得 curl_close($ch); // cURLのクローズ $r = explode("\n", $r); (preg_match('/200/', $r[0])) ? $result = true : $result = false; return $result; } if(!is_admin()){ function register_jQuery(){ wp_deregister_script( 'jquery' ); //あらかじめ登録されているjQueryを登録解除する $url = 'https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js'; $test_url = file_check($url); if ($test_url) { wp_register_script('jquery', '//ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js', array(), NULL, false); } else { $local_url = get_stylesheet_directory_uri() . "/lib/jquery.min.js"; wp_register_script('jquery', $local_url, array(), NULL, false); } wp_enqueue_script('jquery'); //登録し直したjQueryを読み込む } add_action('wp_enqueue_scripts', 'register_jQuery'); } add_filter( 'script_loader_tag', function ( $tag, $handle ) { if ( 'jquery' !== $handle ){ return $tag; } return str_replace( ' src', ' async defer src', $tag ); }, 0, 2 );うちのサーバーはfile_get_contentsが利用できないサーバーなので、ファイルのチェックにcurlを利用してます。また、wordpressの自前jQueryを利用しないように、jqueryの最新版をダウンロードしておいて子テーマ(だったと思う)の/lib/フォルダにjquery.min.jsとして保存してます。CDNが何かしらエラーを返したらそれを使うようにしている感じです。
で、script_loader_tagにて、srcをasync defer srcに置換して出力するようにしています。わいひらさん、ちょっと長いので修正大変だと思いますけど、よろしくお願いします。
-
2015年7月25日 4:58 PM #29908
わいひらキーマスターjQueryの呼び出し位置は、呼び出す順番を変えれば良いのでしょうが、僕も、どこで呼び出せば不具合が出ないかは、わかっていません。
いろいろ試したら良いのかもしれませんが、不具合が出たら、利用者の方に迷惑がかかるので。
ヘッダーで読み込んでおいたほうが、安全ですし、不具合の危険を冒してまでフッターで読み込んだからといって、そこまで効果があるとは思えないので、そのままにしています。
最適な呼び出し方法は、hidekichiさんの方法などを参考にいろいろ試してみてください。
-
-
投稿者投稿
- フォーラム「テーマファイルのカスタマイズに関する質問など」には新規投稿および返信を追加できません。