ポータル的なサイトの場合、トップページの情報掲載量が多く処理が重くなりがちですよね。こんなときの対策として、WP Super Cache や W3 Total Cache などのキャッシュプラグインを利用することも1つの手ではありますが、ランダムな表示箇所があったり、カウンターの表示があったり、ログイン処理があったりなどなど、すんなりとキャッシュでは解決できない場合も出てきたりします。
こんな場合は、Transients API を用いて取得結果のデータをキャッシュとして保持する方法があります。
Transients API は、通常 options テーブルにデータを保存しますが、オブジェクトキャッシュを利用している場合は、そちらを利用し高速に動作します。
また、有効期限を指定しない場合は、キャッシュの更新・破棄を行わない限り永久的なキャッシュとして動作します。(注:ただし、この手法は推奨されていません。)
実装方法は、簡単で手順は下記の通り。
キャッシュ化するデータの取得部分を分岐処理で囲むだけとなります。
また、CODE 1 は、Transients API を用いた最新記事をキャッシュするサンプルコードです。このコードで クエリー数で89、WordPressの実行時間で500ミリ秒程度の改善が見られました。
- get_transient 関数でキャッシュデータを取得。データがある場合はそのまま利用
- 結果が false だった場合には、本来の取得コードを実行
- 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件のフィードバック