WordPress6.1以降でWP_Queryのデータベースクエリキャッシュを無効化する方法

WordPress6.1以降でWP_Queryのデータベースクエリキャッシュを無効化する方法

WordPress6.1以降でWP_Queryのデータベースクエリキャッシュを無効化する方法

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();
?>

あとがき

データベースクエリがキャッシュされることによりパフォーマンスが改善するので、できれば無効化せずに実装できた方が好ましいですね。

明らかにキャッシュのせいで不具合が出たり意図した結果にならない場合は、無効化して改善するか検証してみましょう。

この記事が気に入ったら
いいね!してね♪

Twitter で

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です