<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SEO | きいちログ</title>
	<atom:link href="https://wptech.kiichiro.work/tag/seo/feed/" rel="self" type="application/rss+xml" />
	<link>https://wptech.kiichiro.work</link>
	<description>WordPressとかAWSとかPHPとか</description>
	<lastBuildDate>Wed, 18 Sep 2024 15:47:13 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>【WordPress】WordPressのサイトでLCPを改善する</title>
		<link>https://wptech.kiichiro.work/39hrulvz3h/</link>
		
		<dc:creator><![CDATA[むらおか]]></dc:creator>
		<pubDate>Fri, 16 Dec 2022 09:39:24 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://wptech.kiichiro.work/?p=1012</guid>

					<description><![CDATA[長かったLCPとの戦いが一段落ついたので備忘録的に。 はじめに LCP (Largest Contentful Paint) は、PageSpeed Insights (Lighthouse) で計測されるパフォーマンス [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>長かったLCPとの戦いが一段落ついたので備忘録的に。</p>



<h1 class="wp-block-heading">はじめに</h1>



<p>LCP (Largest Contentful Paint) は、PageSpeed Insights (Lighthouse) で計測されるパフォーマンスに関する指標の1つです。Googleが重要としている健全なウェブサイトであることを測る3つの指標 「Core Web Vitals」 のうちの1つでもあります。</p>




<a rel="noopener" href="https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/" title="Largest Contentful Paint  |  Lighthouse  |  Chrome for Developers" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fdeveloper.chrome.com%2Fdocs%2Flighthouse%2Fperformance%2Flighthouse-largest-contentful-paint%2F?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Largest Contentful Paint  |  Lighthouse  |  Chrome for Developers</div><div class="blogcard-snippet external-blogcard-snippet">Learn about Lighthouse&#039;s Largest Contentful Paint metric and how to measure and optimize it.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">developer.chrome.com</div></div></div></div></a>



<p>LCPはビューポート内に表示される最も大きいコンテンツのレンダリングにかかった時間(秒)が値としてレポートされ、これが2.5秒以内であれば良好であると判断されます。さらにPageSpeed Insights のモバイルの診断はローエンドモバイルかつ低速回線でスロットリングされるため、思った以上に遅くレポートされることが多いと思われます。</p>



<p>今回はWordPressで構築されたサイトで行ったLCP改善の施策を整理していきます。</p>



<h1 class="wp-block-heading">やったこと</h1>



<p>Googleのドキュメントを読んだり、Lighthouseの結果からおすすめされた施策を試してみて効果の高かったものを列挙していきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"></li><li><a href="#toc1" tabindex="0">キャッシュを有効化する</a><ol><li><a href="#toc2" tabindex="0">キャッシュ系プラグインを使う</a></li><li><a href="#toc3" tabindex="0">CDNを使う</a></li></ol></li><li><a href="#toc4" tabindex="0">JavaScriptの読み込み時間を削減する</a><ol><li><a href="#toc5" tabindex="0">読み込みを遅延させるプラグインを使う</a></li></ol></li><li><a href="#toc6" tabindex="0">使っていないJavaScriptを読み込まない</a></li><li><a href="#toc7" tabindex="0">投稿の構成を変える</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">キャッシュを有効化する</span></h2>



<p>標準のWordPressは投稿を表示する際に毎回サーバーサイドでPHPを実行するようになっています。投稿データはDBに永続化されており、その投稿データをテンプレートに渡して描画することになります。<br>このPHPの処理とDBへのアクセスがパフォーマンスのボトルネックになりやすいため、キャッシュをすることでこれを減らそうという試みです。</p>



<h3 class="wp-block-heading"><span id="toc2">キャッシュ系プラグインを使う</span></h3>



<p>キャッシュ系プラグインはプラグイン毎にキャッシュの仕組みが異なります。<a href="https://wptech.kiichiro.work/966iksg49s/" data-type="post" data-id="801">「永続オブジェクトキャッシュを使用してください」が気になったのでコアを覗いてみた</a> で触れたオブジェクトキャッシュはメモリ上のキャッシュでサーバーサイドのPHPの処理を高速化しますが、今回は後述するCDNとの相性を考慮して WP Fastest Cache を使用しました。</p>




<a rel="noopener" href="https://ja.wordpress.org/plugins/wp-fastest-cache/" title="WP Fastest Cache" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fja.wordpress.org%2Fplugins%2Fwp-fastest-cache%2F?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">WP Fastest Cache</div><div class="blogcard-snippet external-blogcard-snippet">最もシンプルで速いWP キャッシュシステム</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ja.wordpress.org/plugins/wp-fastest-cache/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">ja.wordpress.org</div></div></div></div></a>



<p>WP Fastest Cache はキャッシュの設定を有効化することで投稿データをhtmlファイルに出力します。htmlファイルが一度生成されると以降はそのhtmlファイルを直接読み込むことになります。<br>これにより、PHPの実行とDBへのアクセスの回数が削減され、パフォーマンスの改善が見込まれます。</p>



<h3 class="wp-block-heading"><span id="toc3">CDNを使う</span></h3>



<p>CDNはコンテンツをクライアントに近いエッジロケーションから配信する仕組みで、コンテンツを保持するサーバーへのリクエストは行わず、コンテンツをキャッシュしたサーバーがコンテンツを返します。元々のコンテンツを保持するサーバーをオリジンと呼びます。<br>利用するCDNと設定によってキャッシュの動作は変わってきますが、WordPressではパスパターンでのキャッシュを採用することが多いかと思われます。</p>



<p>キャッシュ系プラグインの WP Fastest Cache は、<code>wp-content/cache</code> 配下に投稿データのhtmlを出力しますし、画像ファイルは <code>wp-content/uploads</code> 、大抵のテーマやプラグインが生成する独自の静的ファイル群も概ね <code>wp-content</code> 配下ですので、<code>wp-content</code> 配下をキャッシュできる設定が効果的かと思います。</p>



<p>ちなみにAWS Lightsail ではWordPress最適設定として、<code>wp-includes/*</code> と <code>wp-content/*</code> をキャッシュ対象としています。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="888" height="300" src="https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-1.webp" alt="AWS Lightsail のCDNのキャッシュのパスパターン" class="wp-image-1135" srcset="https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-1.webp 888w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-1-300x101.webp 300w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-1-768x259.webp 768w" sizes="(max-width: 888px) 100vw, 888px" /></figure>



<h2 class="wp-block-heading"><span id="toc4">JavaScriptの読み込み時間を削減する</span></h2>



<p>JavaScriptファイルのサイズを減らしたり、読み込みを遅延させることはパフォーマンス改善に繋がります。JavaScriptの読み込みはダウンロードだけではなくブラウザによる解析やコンパイルといったオーバーヘッドが関わってくるため、同程度のサイズの画像より処理コストが高く時間がかかるのだそうです。</p>




<a rel="noopener" href="https://web.dev/optimizing-content-efficiency-javascript-startup-optimization/" title="JavaScript Start-up Optimization  |  Articles  |  web.dev" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fweb.dev%2Foptimizing-content-efficiency-javascript-startup-optimization%2F?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">JavaScript Start-up Optimization  |  Articles  |  web.dev</div><div class="blogcard-snippet external-blogcard-snippet">Keep your network transmission and parse/compile cost for JavaScript low to ensure pages get interactive quickly.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://web.dev/optimizing-content-efficiency-javascript-startup-optimization/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">web.dev</div></div></div></div></a>



<h3 class="wp-block-heading"><span id="toc5">読み込みを遅延させるプラグインを使う</span></h3>



<p>Google Analytics や Google Tag Manager と連携している場合は、該当のイベントを発火するjsの読み込みが発生します。このjsの読み込みに時間がかかってしまうようです。Lighthouseでは改善方法としてjs自体の削減か読み込みを遅延させることを提案されます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="289" src="https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-2-1024x289.webp" alt="使用していない JavaScript の削減 をおすすめされている" class="wp-image-1175" srcset="https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-2-1024x289.webp 1024w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-2-300x85.webp 300w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-2-768x217.webp 768w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-2-1536x434.webp 1536w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-2.webp 1926w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>該当のjsの enqueue を遅延させれば良いのですが、Google系サービスとの連携はプラグインを利用しているケースが多いと思いますので愚直にやろうとすると骨が折れそうです。</p>



<p>Flying Scripts では、遅延読み込みさせたいjsのキーワードを設定することで該当のjsを(おそらく部分一致で)特定し、指定した秒数だけ読み込みを遅らせることができます。</p>




<a rel="noopener" href="https://ja.wordpress.org/plugins/flying-scripts/" title="Flying Scripts: Delay JavaScript to Improve Site Speed &amp; Performance" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fja.wordpress.org%2Fplugins%2Fflying-scripts%2F?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Flying Scripts: Delay JavaScript to Improve Site Speed & Performance</div><div class="blogcard-snippet external-blogcard-snippet">Delay JavaScript to improve speed and performance by loading scripts only when needed, reducing render-blocking for a fa...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ja.wordpress.org/plugins/flying-scripts/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">ja.wordpress.org</div></div></div></div></a>



<p>Tag Manager だったら↓このように設定すればOK。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="188" src="https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-3-1024x188.webp" alt="Flying Scripts の設定画面で keyword を指定している" class="wp-image-1204" srcset="https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-3-1024x188.webp 1024w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-3-300x55.webp 300w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-3-768x141.webp 768w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-3-1536x282.webp 1536w, https://wptech.kiichiro.work/wp-content/uploads/2022/12/image-3.webp 1668w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>仕組みとしては、指定された秒数が経過したあとにDOMに突っ込んでいるようで、結構な力技でした。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="inject-js.php" data-lang="PHP"><code>const loadScriptsTimer = setTimeout(loadScripts,&lt;?php echo $timeout ?&gt;* 1000</code></pre></div>



<p>注意点としては、上記の通り力技なので Tag Manager の設定によってはタグのイベントが発火されない可能性があるかもしれません。十分にテストを行った方が良さそうです。</p>



<h2 class="wp-block-heading"><span id="toc6">使っていないJavaScriptを読み込まない</span></h2>



<p>テーマやプラグインによっては標準で enqueue されているjsがあるかと思いますが、そのjsを使っている機能が一部だけで該当機能を使わない場合はjsを読み込まないようにするということも出来ます。<br>例えば、カルーセル機能を有したウィジェットのために読み込まれている Slick.js は、当該ウィジェットを利用しなければ不要なはずです。</p>



<p>こちらは <code>functions.php</code> に数行追加するだけでOKです。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-php" data-file="functions.php" data-lang="PHP"><code>function deregister_unnecessary_scripts() {
  wp_deregister_script(&#39;handle&#39;);
}
// 注意: hookのタイミングはenqueueされた後である必要がある
add_action(&#39;wp_enqueue_scripts&#39;, &#39;deregister_unnecessary_scripts&#39;);</code></pre></div>



<h2 class="wp-block-heading"><span id="toc7">投稿の構成を変える</span></h2>



<p>冒頭にも書きましたが、LCPはファーストビューで読み込まれるコンテンツのうち、最もサイズの大きい要素の読み込みにかかった時間です。よって、サイズの大きいものはファーストビューに含めないという方法もありかと思います。単純にサムネイルをタイトルの直下に配置しないとかが考えられます。</p>



<h1 class="wp-block-heading">おわりに</h1>



<p>LCP改善をやってみて、WordPressで対策するのは様々な工夫が必要だなと感じました。結局はテーマやプラグインに依存するところが多いですので、今回記載した施策がすべてに当てはまるものでは無いかと思います。また、「画像を WebP に変換する」「静的ファイルをminifyする」など、記載しなかった施策もいくつかあります。このあたりは別の機会にまとめられれば。。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
