キャッシュを使って 少しでも クエリ数を 抑える方法
僕は 最近まで 知らなかったのですが…
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'
等の 効果は 得られませんが 背に腹は代えられないので 一つ 対策として 覚えておいたほうが良いかもしれません