WordPressで投稿一覧を表示するときは、ループと呼ばれる繰り返し処理が必要です。
その中でも特定のカテゴリ記事を表示するには、条件指定できる「サブループ」を使います。
例えば以下のようなケース。カッコで囲んだ条件は、内容に応じてパラメータで調整します。
- トップページに、お知らせを「5件まで」表示したい
- 投稿ページに、「日付順」の「関連一覧」を表示したい
カテゴリに限らず「特定の条件で表示する」ことが目的なら、今回の方法を応用できますよ!
はじめに
本記事では、カテゴリにデフォルトで登録されている「未分類」を使って一覧を作成します。
以下は完成コード。日付とタイトルをリスト形式で表示する汎用的な内容です。
<?php
$args = array(
'post_type' => 'post', // 投稿タイプ
'category_name' => 'uncategorized', // カテゴリ名(スラッグ)
'posts_per_page' => 5 // 表示件数
);
$new_query = new WP_Query($args);
?>
<?php if ($new_query->have_posts()) : ?>
<ul>
<?php while ($new_query->have_posts()) : $new_query->the_post(); ?>
<li>
<?php the_time('Y.m.d'); ?>
<?php the_title(); ?>
</li>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
</ul>
<?php else : ?>
<p>記事がありません。</p>
<?php endif; ?>
サブループとは
サブループとは、自分で条件を決めて投稿を制御、表示する繰り返し処理(ループ)のこと。
もっと端的に言うと、既存のループ以外にオリジナルの「カスタムループ」を作る機能です。
<?php
$args = array(
'post_type' => 'post', // 投稿タイプ
'category_name' => 'uncategorized', // カテゴリ名(スラッグ)
'posts_per_page' => 5, // 表示件数
);
$new_query = new WP_Query($args);
?>
<?php if ($new_query->have_posts()) : ?>
<?php while ($new_query->have_posts()) : $new_query->the_post(); ?>
<!-- 繰り返し処理する内容 -->
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else : ?>
<!-- 取得できない場合に処理する内容 -->
<?php endif; ?>
これとは別に、WordPress側で用意している、既存の繰り返し処理をメインループといいます。
設置するだけでデータを取得できる反面、1ページに1つまで&条件が指定できないところがネック。
<?php if(have_posts()): ?>
<?php while(have_posts()): the_post(); ?>
<!-- 繰り返し処理する内容 -->
<?php endwhile; ?>
<?php else: ?>
<!-- 取得できない場合に処理する内容 -->
<?php endif; ?>
条件を付けて表示したり、2つ以上のループを使うときはサブループを使う必要があります。
サブクエリとは
サブループに似た「サブクエリ」は、自分で指定した条件でデータベースに問い合わせる命令(文)のこと。
WordPressではWP_Query
やget_posts
という便利な機能が用意されているので、SQLを書く必要はありません。
今回はWP_Query
クラスでクエリを作成、実行し、データベースから投稿データを取得します。
$new_query = new WP_Query($args);
パラメータと値
WP_Query
に渡す$args
のパラメータは、Developer Resourcesから設定を調べられます。
条件の指定によく使うパラメータは下表の通り。値は一例です。
条件項目 | パラメータ | 値の例 |
---|---|---|
投稿タイプ | post_type | post page custom |
カテゴリID | cat | 1 |
カテゴリ名 | category_name | slug |
表示件数 | posts_per_page | 10 |
並び替え(昇順と降順) | order | DESC ASC |
並び替え(タイトル順など) | orderby | ID author title |
取得条件を指定
まずは記事を取得するにあたり、条件をつけて絞り込みしていきます。以下サンプルです。
- 投稿タイプは通常の投稿
- カテゴリは未分類
- 表示件数は5件
条件を複数指定するため、配列array()
を用意して、引数として使う変数$args
に代入。
<?php
$args = array();
?>
投稿タイプは通常の投稿なのでpost
を、カテゴリ名にはスラッグを入れます。件数は5
。
<?php
$args = array(
'post_type' => 'post', // 投稿タイプ
'category_name' => 'uncategorized', // カテゴリ名(スラッグ)
'posts_per_page' => 5, // 表示件数
);
?>
WP_Query
に$args
を入れてインスタンス化し、投稿データを抽出する下準備は完了です。
<?php
$args = array(
'post_type' => 'post',
'category_name' => 'uncategorized',
'posts_per_page' => 5
);
$new_query = new WP_Query($args); // 追加
?>
記事一覧を表示
$new_query
に投稿データが格納できたので、最後に繰り返し処理で一覧表示していきます。
クエリに表示する投稿があるかをhave_posts()
で確認。if
文で囲んで、条件分岐します。
<?php if ($new_query->have_posts()) : ?>
true
と判定されたら、投稿があるか確認:現在の投稿データを取得。the_post()
で次の投稿へ移動し、while
で処理を繰り返します。
<?php while ($new_query->have_posts()) : $new_query->the_post(); ?>
<!-- 繰り返し処理する内容 -->
<?php endwhile; ?>
最後に、$new_query->the_post()
で$post
のクエリを上書きしたため、メインクエリに戻す作業を行います。
<?php wp_reset_postdata(); ?>
$post
は現在の投稿データを格納しているグローバル変数です。
<ul>
と<li>
を入れて日付とタイトルを囲み、リスト形式にしたものがこちら。任意でアレンジしてください。
<?php
$args = array(
'post_type' => 'post',
'category_name' => 'uncategorized',
'posts_per_page' => 5
);
$new_query = new WP_Query($args);
?>
<?php if ($new_query->have_posts()) : ?>
<ul>
<?php while ($new_query->have_posts()) : $new_query->the_post(); ?>
<li>
<?php the_time('Y.m.d'); ?>
<?php the_title(); ?>
</li>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
</ul>
<?php else : ?>
<p>記事がありません。</p>
<?php endif; ?>
おわりに
条件を指定して一覧表示する方法は、お知らせや人気記事ランキングなど色々な場面で使います。
その際に変える項目は、$args
に入れる条件とwhile
で囲まれた表示内容の2点になります。
繰り返し部分は変わらないので、あとは、公式リファレンスのパラメータを見ながら作ってみてください。
以下ではメインループによるカテゴリ表示について解説。リストとの組み合わせにおすすめ!