ポータル的なサイトの場合、トップページの情報掲載量が多く処理が重くなりがちですよね。こんなときの対策として、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
この記事は、jim912によって書かれたものです。
引用を行う場合は、著作権法に定める範囲にて、引用元であるSimple Colorsの出展元表示とhttp://www.warna.info/archives/1681/へのリンクを必ず行って下さい。
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を用いて表示の高速化を図る http://t.co/vruDQzR @wordpress_fan #WordPressJP #ブログ
ぶろぐった:WordPressのTransients APIを用いて表示の高速化を図る http://t.co/vruDQzR @wordpress_fan #WordPressJP #ブログ
ぶろぐった:WordPressのTransients APIを用いて表示の高速化を図る http://t.co/vruDQzR @wordpress_fan #WordPressJP #ブログ
WordPressのTransients APIを用いて表示の高速化を図る http://t.co/KInoJLK
ふむふむ。 WordPressのTransients APIを用いて表示の高速化を図る | Simple Colors http://t.co/p0tmwVC
ふむふむ。
ぶろぐった:WordPressのTransients APIを用いて表示の高速化を図る http://t.co/vruDQzR @wordpress_fan #WordPressJP #ブログ
【お昼の再掲】ぶろぐった:WordPressのTransients APIを用いて表示の高速化を図る http://t.co/vruDQzR
【お昼の再掲】ぶろぐった:WordPressのTransients APIを用いて表示の高速化を図る http://t.co/vruDQzR
これって、どう使えばいいんだ?? / WordPressのTransients APIを用いて表示の高速化を図る | Simple Colors http://t.co/2DDFDmx
これって、どう使えばいいんだ??
WordPressのTransients APIを用いて表示の高速化を図る | Simple Colors http://t.co/3ZTSKWX
WordPressのTransients APIを用いて表示の高速化を図る | Simple Colors: ポータル的なサイトの場合、トップページの情報掲載量が多く処理が重くなりがちですよね。こんなときの対策として、WP … http://t.co/gnApxRd
WordPressのTransients APIを用いて表示の高速化を図る | Simple Colors http://t.co/a2DF6Bp #wordpress
【お昼の再掲】ぶろぐった:WordPressのTransients APIを用いて表示の高速化を図る http://t.co/vruDQzR
WordPressのTransients APIを用いて表示の高速化を図る | Simple Colors http://ow.ly/6dm3J
試してみよう
高速化。。色々ありすぎてもう置いてかれてる。。RT @jim0912: ぶろぐった:WordPressのTransients APIを用いて表示の高速化を図る http://t.co/pV2wtuz @wordpress_fan #WordPressJP #ブログ
WordPressのTransients APIを用いて表示の高速化を図る http://t.co/HPsmGEU
ピンバック: WordPress の Transients API | 雑念ベース