てくてくあるく

WordPress の テーマ とか プラグイン に ついて 勉強しています

僕は 最近まで 知らなかったのですが…
WP には WP Object Cache と Transients API の 2つの キャッシュ機能 が 存在していました!!

簡単に WP Object Cache と Transients API を 説明しますと


WP Object Cache


WP Object Cache
https://wpdocs.osdn.jp/クラスリファレンス/WP_Object_Cache

こちらは 単純に $GLOBALS['wp_object_cache'] = new WP_Object_Cache(); ということをやっています

なので ページの読み込みが終わると 消えてしまいます


Transients API


Transients API
https://wpdocs.osdn.jp/Transients_API

こちらは wp_options テーブルへ キー と 有効期限 と バリュー を セット で 保存する ということをやっています

なので 有効期限がすぎるまで キャッシュ してくれます

こちらのほうが アクセス数 が 多いサイトでは キャッシュ時間を 長めに設定しておけば 効果は 絶大 だと思います


僕が考える Transients API の 使用例


WP Query にも キャッシュ する 機能はあるのですが
やはり 表示する結果 すべてを キャッシュしてしまったほうが 効率が良さそうです

WP_Query キャッシュのパラメータ
https://wpdocs.osdn.jp/関数リファレンス/WP_Query#Caching_Parameters

どのような使い方かといいますと

$text = get_transient( 'transient_sample' );

if( empty( $text ) ) {
  
  $text  = '<ul>' . PHP_EOL;
  
  $args = array(
    'post_type'      => 'post',
    'posts_per_page' => 20,
  );
  $the_query = new WP_Query( $args );
  if( $the_query->have_posts() ) :
    while( $the_query->have_posts() ) :
      $the_query->the_post();
      $text .= '<li>' . '<a href="' . get_the_permalink() . '">' . get_the_title() . '</a>' . '</li>' . PHP_EOL;
    endwhile;
  endif;
  wp_reset_postdata();
  
  $text .= '</ul>' . PHP_EOL;
  
  set_transient( 'transient_sample', $text, 1 * HOUR_IN_SECONDS );
  
}

echo( $text );

この様に 結果まるごと キャッシュしてしまう という 感じです

これならば キャッシュがあれば new WP_Query も 行いませんし while で 記事があるだけ loop処理も行いません

単純に DB から キー から バリュー を 取ってくるだけなので サーバーの 負荷も 下げられます


実際に アクセス数 が 多いサイトで 試したところ 応答時間に 6秒くらいかかっていたところ 1.5秒くらい で 結果が得られました

キャッシュを してしまっているので 'orderby' => 'rand' 等の 効果は 得られませんが 背に腹は代えられないので 一つ 対策として 覚えておいたほうが良いかもしれません

Related Article

Docker で 開発環境 の ベースを 作ってみた (1)

詳細へ »

データベース接続確立のエラー ページ の カスタマイズ

詳細へ »