記事一覧を取得する!WP_Queryの使い方【WordPress】

この記事の前提条件

対象: WordPress(テーマファイルの編集ができる環境)
難易度: ★★☆
所要時間: 約10分

「特定のカテゴリの記事だけ一覧に出したい」「関連記事を3件だけ表示したい」…メインの記事一覧とは別の条件で記事を取得したい時に使うのがWP_Queryです。WordPressのテーマカスタマイズで避けて通れない、基本かつ重要な機能です。

基本の書き方: newして、ループして、リセットする

WP_Queryは、3つのステップがセットになった書き方が基本形です。

<?php
$args = array(
  'category_name' => 'photoshop',
  'posts_per_page' => 5,
);
$my_query = new WP_Query( $args );

if ( $my_query->have_posts() ) :
  while ( $my_query->have_posts() ) : $my_query->the_post();
    the_title();
  endwhile;
endif;

wp_reset_postdata();
?>

ポイントを順番に見ていきます。

  • $args: 取得条件を配列で指定する
  • new WP_Query( $args ): 条件に沿って記事を取得する
  • whileループ: 取得した記事を1件ずつ処理する
  • wp_reset_postdata(): 元のメインループの情報に戻す
⚠️ wp_reset_postdata()を忘れると別の場所がおかしくなる

これが一番のつまずきポイントです。WP_Queryでサブループを回すと、the_title()のようなテンプレートタグが参照する「現在の記事」の情報が、サブループの記事に一時的に書き換わります。wp_reset_postdata()を忘れると、サブループより後にあるメインループ側の表示まで狂ってしまう、という一見原因が分かりにくいバグにつながります。サブループを使ったら、使い終わったら必ずリセットする、とセットで覚えておいてください。

よく使う条件指定の例

$args = array(
  'post_type'      => 'post',
  'posts_per_page' => 3,
  'orderby'        => 'rand',        // ランダム表示
  'post__not_in'   => array( get_the_ID() ), // 現在表示中の記事を除外
  'category__in'   => array( 11 ),   // カテゴリID指定
);

関連記事コーナーを作る時によく使う組み合わせです。post__not_inで自分自身を除外しないと、関連記事欄に今読んでいる記事自体が表示されてしまうので、忘れずに入れておきましょう。

実務での注意点: 多用するとサイトが重くなる

WP_Queryはデータベースへの問い合わせ(クエリ)を発生させる処理です。1ページの中で何度も呼び出すと、その分だけデータベースへの負荷が増え、表示速度が遅くなります。「本当にこの場所で新しく取得する必要があるか」を考え、可能ならキャッシュを検討するなど、使いすぎには注意しましょう。

まとめ

  • 基本は「new WP_Query() → whileループ → wp_reset_postdata()」の3点セット
  • wp_reset_postdata()を忘れると、サブループより後の表示がおかしくなる
  • 関連記事表示ではpost__not_inで自分自身を除外するのを忘れずに
  • 1ページ内で多用するとデータベース負荷が増えるので、使いすぎに注意する