jqueryの読み込みをフッターでやりたい

4件の返信スレッドを表示中
  • 投稿者
    投稿
    • #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

      子テーマを使用してカスタマイズしているのですが、その場合、どこをどう書きかえればよろしいのでしょうか?

    • #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 スクリプトのレンダリングブロックを解消する にてどうぞ。

      実際には、もう少し違うことをしているんですけれども、意味合いはこんな感じです。

    • #29875
      Nyu
      ゲスト

      Hidekichiさん、すごく丁寧な解説をしてくださりどうもありがとうございます。
      教えていただいたことを試しにやってみましたが、仰る通りSNSのカウントが正常に取得出来ませんでした。
      しかし、既存のjsファイルの位置を変更するというテクニックは知りませんでしたので、非常に勉強になりました。

      どうもありがとうございました!

    • #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に置換して出力するようにしています。

      わいひらさん、ちょっと長いので修正大変だと思いますけど、よろしくお願いします。

    • #29908
      アバター画像わいひら
      キーマスター

      jQueryの呼び出し位置は、呼び出す順番を変えれば良いのでしょうが、僕も、どこで呼び出せば不具合が出ないかは、わかっていません。
      いろいろ試したら良いのかもしれませんが、不具合が出たら、利用者の方に迷惑がかかるので。
      ヘッダーで読み込んでおいたほうが、安全ですし、不具合の危険を冒してまでフッターで読み込んだからといって、そこまで効果があるとは思えないので、そのままにしています。
      最適な呼び出し方法は、hidekichiさんの方法などを参考にいろいろ試してみてください。

4件の返信スレッドを表示中
  • フォーラム「テーマファイルのカスタマイズに関する質問など」には新規投稿および返信を追加できません。
スポンサーリンク
アドセンス(大)
アドセンス(大)