WordPress6.1からWP_Queryでのデータベースクエリがキャッシュされるようになりました。同じクエリが実行された際にキャッシュから読み込まれるようになり、パフォーマンスの改善に役立ちます。
これまでも意図的にキャッシュさせることは可能でしたが、WordPressコアに組み込まれたことにより、キャッシュを考慮した実装にする必要がなくなりました。
一方でクエリがキャッシュされることにより、意図しない結果になってしまうケースも出てくるかもしれません。その場合は、パフォーマンスには影響しますが、WP_Queryのデータベースクエリキャッシュを無効化することで解決できます。
WP_Queryのデータベースクエリキャッシュを無効化する方法
WP_Queryのデータベースクエリキャッシュを無効化するには、適用しているテーマのfunctions.phpに以下を追加します。
function disable_caching($wp_query) {
$wp_query->query_vars['cache_results'] = false;
}
add_action('parse_query', 'disable_caching');
参考:Improvements to WP_Query performance in 6.1
上記コードを追加することで、WP_Queryのデータベースクエリはキャッシュされなくなります。
orderbyパラメータでrandを指定している場合の挙動
orderbyパラメータで”rand”を指定してランダムに投稿を取得している場合、キャッシュから読み込まれると毎回同じ結果になってしまうのではないか?という疑問が湧くと思います。
これについては、上記参考ページのコメント欄でも回答があるように、orderbyでrandが指定されている場合はキャッシュは利用されない仕組みになっているということです。
実際に以下のコードを追加して試してみたところ、ちゃんと投稿がランダムに表示されました。
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'paged' => $paged,
'posts_per_page' => 10,
'post_type' => 'post',
'post_status' => 'publish',
'orderby' => 'rand'
);
$wp_query_post = new WP_Query($args);
if ($wp_query_post->have_posts()) :
?>
<ul>
<?php while ($wp_query_post->have_posts()) : $wp_query_post->the_post(); ?>
<li>
<?php the_title(); ?>
</li>
<?php endwhile; ?>
</ul>
<?php
endif;
wp_reset_postdata();
?>
あとがき
データベースクエリがキャッシュされることによりパフォーマンスが改善するので、できれば無効化せずに実装できた方が好ましいですね。
明らかにキャッシュのせいで不具合が出たり意図した結果にならない場合は、無効化して改善するか検証してみましょう。