この記事の前提条件
対象: 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ページ内で多用するとデータベース負荷が増えるので、使いすぎに注意する