【 更新 】おすすめ記事はこちら

【WordPress】特定のカテゴリ記事を一覧表示する

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_Queryget_postsという便利な機能が用意されているので、SQLを書く必要はありません。

今回はWP_Queryクラスでクエリを作成、実行し、データベースから投稿データを取得します。

$new_query = new WP_Query($args);

パラメータと値

WP_Queryに渡す$argsのパラメータは、Developer Resourcesから設定を調べられます。

条件の指定によく使うパラメータは下表の通り。値は一例です。

条件項目パラメータの例
投稿タイプpost_typepost page custom
カテゴリIDcat1
カテゴリ名category_nameslug
表示件数posts_per_page10
並び替え(昇順と降順)orderDESC ASC
並び替え(タイトル順など)orderbyID 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点になります。

繰り返し部分は変わらないので、あとは、公式リファレンスのパラメータを見ながら作ってみてください。

以下ではメインループによるカテゴリ表示について解説。リストとの組み合わせにおすすめ!