WordPressのTransients APIを用いて表示の高速化を図る

ポータル的なサイトの場合、トップページの情報掲載量が多く処理が重くなりがちですよね。こんなときの対策として、WP Super CacheW3 Total Cache などのキャッシュプラグインを利用することも1つの手ではありますが、ランダムな表示箇所があったり、カウンターの表示があったり、ログイン処理があったりなどなど、すんなりとキャッシュでは解決できない場合も出てきたりします。

こんな場合は、Transients API を用いて取得結果のデータをキャッシュとして保持する方法があります。

Transients API は、通常 options テーブルにデータを保存しますが、オブジェクトキャッシュを利用している場合は、そちらを利用し高速に動作します。
また、有効期限を指定しない場合は、キャッシュの更新・破棄を行わない限り永久的なキャッシュとして動作します。(注:ただし、この手法は推奨されていません。)

実装方法は、簡単で手順は下記の通り。
キャッシュ化するデータの取得部分を分岐処理で囲むだけとなります。
また、CODE 1 は、Transients API を用いた最新記事をキャッシュするサンプルコードです。このコードで クエリー数で89、WordPressの実行時間で500ミリ秒程度の改善が見られました。

  1. get_transient 関数でキャッシュデータを取得。データがある場合はそのまま利用
  2. 結果が false だった場合には、本来の取得コードを実行
  3. set_transient 関数でキャッシュデータを保存

CODE 1

$transients = get_transient( 'transient_key' );
if ( $transients === false ) {
	$transients['top_cat1'] = get_posts("numberposts=5&post_type=post_type&orderby=menu_order&taxonomy=taxonomy&term=cat1");
	$transients['top_cat2'] = get_posts("numberposts=10&post_type=post_type&orderby=menu_order&taxonomy=taxonomy&term=cat2");
	foreach ( $transients as $cat => $transient ) {
		foreach ( $transient as $key => $post ) {
			$transients[$cat][$key]->img = get_the_post_thumbnail( $post->ID, 'thumbnail_size' );
		}
	}
	$transients['top_cat3'] = get_posts("numberposts=12&post_type=post_type&orderby=menu_order&taxonomy=taxonomy&term=cat3");
	set_transient( 'transient_key', $transients, 3600 * 24 );
}

キャッシュデータの破棄は、delete_transient 関数で行うことができます。CODE 1 の場合は、記事に関するデータのキャッシュなので、記事が公開された段階で破棄すればいいので、CODE 2 のような記述になります。(publish_post_type の post_type がキャッシュを利用する投稿タイプ。投稿だったら post、固定ページだったら page になります。)

CODE 2

function clear_transient_cache() {
	delete_transient( 'transient_key' );
}
add_action( 'publish_post_type', 'clear_transient_cache' );

この他にも、マルチサイト時にネットワーク全体のキャッシュとして利用される、get_site_transient、set_site_transient、delete_site_transient なども存在します。(利用方法は、get_transientなどと同様)

参考

WordPressのTransients APIで有効期限付きのデータを保存する。

「WordPressのTransients APIを用いて表示の高速化を図る」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です