この記事は、Wordrpessのアーカイブページをキャッシュしてサイトの表示速度を速くするカスタマイズについてご紹介しています。
記事の内容は、SWELLを使っている人向けのカスタマイズになっていますが、他のテーマでもカスタマイズの考え方は一緒です。
アーカイブページをキャッシュすると何がうれしいのか?
アーカイブページには、カテゴリアーカイブ、年月アーカイブなどがあります。
それらは、記事の数が増えるとどんどん表示が遅くなっていきますので、ページ出力をキャッシュしておいた方が無駄なクエリが発行されなくなり、ページの表示も速くなります。
アーカイブページをキャッシュする時の注意点
アーカイブページのキャッシュが他のページと異なるのはページ分割されることです。
ページ分割単位でキャッシュを作らないといけないことです。
SWELLでアーカイブページをキャッシュするには?
archive.phpは修正しません。
メインループでリストを生成しているループ出力をキャッシュする必要があります。
SWELLでメインループを受け持っているのは、parts/post_list/loop_main.php
になります。
parts/post_list/loop_main.php
を子テーマにコピーして編集します。
カスタマイズの考え方
投稿リストのHTMLを生成している部分(<ul></ul>)をキャッシュします。
キャッシュがある場合は、キャッシュを出力し、キャッシュが無い場合は真面目に処理して、キャッシュに保存します。
ページ分割単位でキャッシュを保存するので、ページ番号をキャッシュファイル名に含めておきます。
他のテーマの場合でも考え方は同じです。
投稿リストのHTMLが違うかもしれませんが、その部分を探せばほぼ同じで行けると思います。
カスタマイズ内容
このファイルに、transientでキャッシュを保存、読み込みという処理を追加すればいいわけです。
transientキャッシュはページ分割ごとに名前を分けて保存して、読み出します。
<?php
use \SWELL_THEME\Parts\Post_List;
if ( ! defined( 'ABSPATH' ) ) exit;
/**
* メインループでの投稿リスト出力テンプレート
*/
$list_args = $variable ?: [];
// リストデータ整理
$list_data = Post_List::get_list_data( $list_args );
$li_args = $list_data['li_args'];
$ul_class = $list_data['ul_class'];
$parts_name = $list_data['parts_name'];
$infeed_interval = $list_data['infeed_interval'];
// 記事がなかった場合
if ( ! have_posts() ) :
$not_founded_text = __( '記事が見つかりませんでした。', 'swell' );
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo apply_filters( 'swell_post_list_404_text', '<p>' . $not_founded_text . '</p>' );
return;
endif;
$transient_key = 'archive_'.get_query_var( 'paged' ).md5(serialize(get_the_archive_title()));;
if(is_archive()) $res = get_transient($transient_key);
if(!$res):
ob_start();
// ループ
$loop_ct = 0;
echo '<ul class="' . esc_attr( $ul_class ) . '">';
while ( have_posts() ) :
the_post();
// インフィード
if ( $infeed_interval && $loop_ct && ( 0 === $loop_ct % $infeed_interval ) ) :
SWELL_Theme::get_parts( 'parts/post_list/infeed_ad', $loop_ct );
endif;
SWELL_Theme::get_parts( 'parts/post_list/' . $parts_name, $li_args );
$loop_ct++;
endwhile;
echo '</ul>';
$res = ob_get_clean();
if(is_archive()){
set_transient(
$transient_key,
$res,
60 * 60 * 24 * 7//秒で指定(サンプルは一日)
);
}
echo $res;
else:
echo $res;
endif;
まとめ:SWELLのアーカイブページをキャッシュする
1万記事とかあるアーカイブで毎度クエリを発行しているのは無駄すぎます。
ページキャッシュを導入していれば、関係ないかもしれません。
ページキャッシュを導入していなかったり、Cloudflare CNDを使っている場合は、サーバー側である程度の高速化を行っておかないとサイトがどんどん遅くなっていきます。
メインループのHTML生成だけキャッシュしても高速化は限定的
カスタマイズしてから気が付いたのですが、メインループのHTML生成部分をキャッシュしてもそれ以前のクエリ発行はキャッシュされず、クエリの高速化には寄与しません。
メインループのクエリが発行されるのはテンプレートファイルが読み込まれる前なので、テンプレートファイルでは何もすることができません。
サブループの場合はクエリ発行もテンプレートファイルにあるのでキャッシュ可能です。

メインループのクエリが発行される部分は、テンプレートファイル内に無いのでキャッシュするのは難しいのでしょうか?
コメント