【WordPress】WP_Query関数のno_found_rowsパラメータについて

  • 投稿 : 2018-05-06
WP_Queryのno_found_rowsをtrueに設定すると速くなるという話なので、実際に調べてみました。
私の環境では記事下に出す関連記事がWP_Queryを使っていて、全件数を取得する必要のないところなので、no_found_rowsをtrueが使えるはずです。

修正方法

参考:WordPressで今読んでいる記事と同じカテゴリーの投稿を関連記事として表示する | 福岡市のホームページ制作・SEO対策ならアイドットデザイン

$args = array(
  'post__not_in' => array($post -> ID), // 今読んでいる記事を除く
  'posts_per_page'=> 10,
  'category__in' => $category_ID,
  'orderby' => 'rand', // ランダムに記事を選ぶ
);

上記のコードを

$args = array(
  'post__not_in' => array($post -> ID), // 今読んでいる記事を除く
  'posts_per_page'=> 10,
  'category__in' => $category_ID,
  'orderby' => 'rand', // ランダムに記事を選ぶ
  'no_found_rows'  => true
);

このように「'no_found_rows' => true」を追加するだけ。

まずは、SQLがどう変わったかを調べる

WordPress › Query Monitor « WordPress Plugins」を使用して調べました。

no_found_rowsをfalse(初期値)

wp-query-no-found-rows01.png

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts 
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1 
AND wp_posts.ID NOT IN (15597)
AND ( wp_term_relationships.term_taxonomy_id IN (19) )
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY RAND()
LIMIT 0, 6

SELECT FOUND_ROWS()

no_found_rowsをtrue

wp-query-no-found-rows02.png

SELECT wp_posts.ID
FROM wp_posts 
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1 
AND wp_posts.ID NOT IN (15597)
AND ( wp_term_relationships.term_taxonomy_id IN (19) )
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY RAND()
LIMIT 0, 6

結果

・1つめのSQLに「SQL_CALC_FOUND_ROWS」がつかなくなっている
・2つめのSQL「SELECT FOUND_ROWS()」が全件数を調べるもので、なくなっている

・SQL_CALC_FOUND_ROWSがつかない
・SQL発行が1つ減る

この2つの要素で、少しは早くなるとは思う。


記事には直接関係ない話

デフォルト値は 'publish' です。しかしユーザーがログイン中なら、'private' が追加されます
関数リファレンス/WP Query - WordPress Codex 日本語版

記事の内容には関係ないけど、「wp_posts.post_status = 'private'」がついてるのはおかしいと思ったのですが、どうも上記の仕様なのでこのままで問題なさそうですね。

補足

リストから絞り込んで取得すると共にトータル件数を取得 - わっふるわっふる
SQL CALC FOUND ROWSを使う - dondari
WordPressのアーカイブページで表示件数を絞りページングさせない方法 | ウェブタタン
WP_Query関数のno_found_rowsパラメータ | てらこや.work
Speed up WordPress WP_Query and query_posts functions

スポンサーリンク