固定ページに指定カテゴリの記事を表示したい!

ヘッダ画像

固定ページに指定カテゴリの記事を表示したい!

WordPressのカスタマイズではページ内にカテゴリで絞り込んだ一覧を表示したいという要望が多いです。

  • 固定ページ内に特定カテゴリの投稿記事だけを載せたい
  • 固定ページに目次ページを作成したい
  • トップページをひとつのカテゴリだけの記事表示にしたい
  • 投稿記事の最後にカテゴリの一覧を表示する

今回はコピペで実装できる特定カテゴリ記事表示の方法を紹介します。
リストでの一覧取得や最新記事だけ取得表示したり、幅広い用途に使えると思います。

指定カテゴリIDの記事を取得表示する

固定ページに表示させたいのであれば、お使いのテーマのpage.phpの下部あたりにコピペするだけで動作するはずです。

<?php
$wp_query = new WP_Query();
$args = array(
  'post_type' => 'post',
  'post_status' => 'publish',
  'category__in' => 2,
  'posts_per_page' => 4,
  'order' => 'DESC'
);
$wp_query->query($args);
?>
<?php 
if ($wp_query->have_posts()) {
  while (have_posts()) { the_post(); 
?>
    <!-- 出力部分 -->
    <p><a href="<?php echo get_permalink(); ?>">
    <?php the_title(); ?></a><br>
    <?php the_excerpt(); ?></p>
    <!-- 出力部分 -->
<?php
  }
wp_reset_postdata();
}
?>

WP_Queryを使ったサブループで基本的には投稿のsingle.phpcategory.phpなどアーカイブ系のテンプレート、そしてサイドバーなどで使っても問題ありません。

プロパティの説明

取得条件は$argsのプロパティと呼ばれる値で指定しています。
上記では目的に沿った最低限のプロパティしか与えていませんので、簡潔に説明します。

'post_type' => 'post'
対象とする投稿タイプでpostは通常の投稿を指します。
投稿はデフォルトでもあるため、今回のサンプルコードでは省略も可能です。

'category__in' => 2
表示したい指定のカテゴリIDを指定します。
複数指定はarray(2,10)のような形です。

'posts_per_page' => 4
表示件数です。
-1で全件取得します。
未指定の場合はダッシュボードの表示設定「1ページに表示する最大投稿数」が表示件数となります。

'order' => 'DESC'
こちらはソート順です。
'DESC' - 最高から最低へ降順 (3, 2, 1; c, b, a)
'ASC' - 最低から最高へ昇順 (1, 2, 3; a, b, c)

ソート条件にはorderbyというパラメータを用い、デフォルトは'post_date'の日付順で上記では省略しています。
サンプルコードは投稿日付の新しい順に表示されます。

その他のソート条件パラメータは下記です。
'orderby' => 'post_date' 日付順(デフォルト)
'orderby' => 'ID' 投稿ID
'orderby' => 'post_author' 著者
'orderby' => 'post_title' タイトル
'orderby' => 'post_name' スラッグ
'orderby' => 'post_type' 投稿タイプ
'orderby' => 'post_modified' 更新日
'orderby' => 'none' 順序をつけない(バージョン2.8以降)

出力内容の変更

Pタグの部分が実際のHTMLへ出力されます。
抜粋が不要でタイトルのみ表示したいということであれば、the_excerpt()を削除します。
下記のようにリストタグの使用も可能ですので、ご希望の形に成形ください。

1.リンク付きのタイトルだけを並べるリストタグ

<ul>
  <li>
    <a href="<?php echo get_permalink(); ?>">
      <?php the_title(); ?>
    </a>
  </li>
</ul> 

2.抜粋付きの定義リストタグ

<dl> <dt><a href="<?php echo get_permalink(); ?>"><?php the_title(); ?></a></dt>
  <dd>
    <?php the_excerpt(); ?>
  </dd>
</dl>

現在の表示カテゴリに属する記事を取得する

バリエーションとして、カテゴリを指定せずとも、現在の表示記事と同じカテゴリに属する記事を自動取得して表示させてみます。
こちらはいずれかのカテゴリに属していることが条件のため、single.php、つまり、投稿で使うことになります。

<?php
if (($cats = get_the_category($post->ID))) {
  $catID = array();
  foreach ($cats as $cat) {
    $catID[] = $cat->cat_ID;
  }
  $wp_query = new WP_Query();
  $args = array(
    'post_type' => 'post',
    'post__not_in' => array( $post->ID ),
    'post_status' => 'publish',
    'category__in' => $catID,
    'posts_per_page' => 4,
    'order' => 'DESC'
  );
  $wp_query->query($args);
  if ($wp_query->have_posts()) {
    while (have_posts()) { the_post(); 
?>
    <!-- 出力部分 -->
    <p><a href="<?php echo get_permalink(); ?>">
    <?php the_title(); ?></a><br>
    <?php the_excerpt(); ?></p>
    <!-- 出力部分 -->
<?php
    }
  wp_reset_postdata();
  }
}
?>

冒頭のget_the_categoryで現在のカテゴリーIDを取得して、それをプロパティのcategory__in$catIDに値として与えるという仕組みです。
また、'post__not_in' => array($post->ID)現在の表示ページを除外しています。
それ以外の基本的な内容は同じです。

これをベースに同じカテゴリの記事を関連記事として自動表示させることもできますので、なかなか使えるパターンかと思います。

コメント一覧

  1. コーラマン より:

    大変有益な情報ありがとうございます。記事の内容とおりにやってみたら固定ページに特定カテゴリーの一覧を表示させることができました。

    ただ質問なのですが
    今後カテゴリーが増えることが想定される場合、なんども同じようなコードを書くのは面倒。

    できるのかどうか分かりませんが、
    固定ページのスラッグ=カテゴリーのスラッグ
    とすることでcategory_nameを指定することはできないもんでしょうか?

    それがもしできれば今後カテゴリーが増えても
    固定ページのスラッグをカテゴリーのスラッグと同じにするだけで表示されるように思ったりしたのですが。。。

    思いつきのようなぶしつけな質問すいません。

    • R3098 より:

      こんにちは。
      パーマリンクなどの設定にもよると思うのですが、固定ページとカテゴリのスラッグを同じにすると、重複してカテゴリページが表示されませんか?
      使いどころが分かればよい方法がありそうですが、とりあえず「ページごとのコンテンツに指定カテゴリの記事取得したい」のであれば、ショートコード化して読み込むカテゴリを指定する、あるいはカテゴリページを使い、コンテンツはカテゴリの説明を使うのはどうでしょう。

  2. コーラマン より:

    お返事ありがとうございます。

    >固定ページとカテゴリのスラッグを同じだと、重複してカテゴリページが表示されませんか

    スラッグを同一にしてもノーマルのurl表示であれば、カテゴリーページには/categoryのディレクトリ?が間に入るので問題はないです。

    >ショートコード化して読み込むカテゴリを指定する

    これがまたカテゴリーが1,000を超えているのでめんちゃいんですよねぇ~笑。

    >カテゴリページを使い、コンテンツはカテゴリの説明を使う。

    カテゴリページも活用しており(noindexですが)コンテンツはカテゴリーの説明と固定ページで非公開にしてある記事を選択することで表示させてるんです。

    ただカテゴリーページに表示させている画像サイズが大きい為、あまり多くの記事を表示させることにページの重さの面で問題アリかな?と。(1つのカテゴリーページに数百の記事があるもんですから。)

    そこで、固定ページには、画像サイズの小さいものにして、カテゴリーの記事を一括表示させようかな?という考えに至り質問になりました。

    ちょっと通常とは違う形でワードプレスを利用しているのでイレギュラーな内容ですよね。お時間取らせてしまい申し訳ありませんでした。

    • R3098 より:

      >スラッグを同一にしてもノーマルのurl表示であれば、カテゴリーページには/categoryのディレクトリ?が間に入るので問題はないです。
      スラッグの代入自体はできると思います。
      パーマリンクやその他設定にも影響を受けると思いますが、現在の環境で固定ページをカテゴリと同じスラッグとして、固定ページ・カテゴリページ、その配下の投稿ページへ問題なくアクセスできますか?

      • コーラマン より:

        カテゴリーのスラッグをdog
        aaa.com/category/dog/
        固定ページのスラグをdog
        aaa.com/dog/
        となるので問題ないですが、何がしかに影響が及ぶ可能性があるんでしょうか?

        現在のところは問題ないように思いますが(問題に気づいてないだけなのかも!?ですね。)

        あ、あとなんかやり取りが複雑な感じになっているような気がしますが、単純に
        page.phpに
        ‘dog’,
        ‘posts_per_page’ => -1,
        );
        $wp_query->query($args);
        if($wp_query->have_posts()){

        のdogの部分を自動で入れたいな♪
        と感じなのでございます。

        さすればページを作成するたびにコードを書く必要がなくなり
        条件分岐で固定ページのスラッグがdogであれば
        dogカテゴリの記事一覧を表示でき、
        固定ページのスラッグがcatであれば
        catカテゴリの記事一覧を表示させることができるかな?と。

        もちろん!もっと単純に毎回コードを書く必要がない方法があれば、それに越したことはないのですけれど、PHPをよく理解していない自分にはハードルが高すぎて…

        • R3098 より:

          実際にアクセスできるのであれば、大丈夫そうですね。
          であれば、シンプルに下記でいけると思います。
          $page = get_post( get_the_ID() ); $slug = $page->post_name;
          $wp_query = new WP_Query();
          $args = array(
          'category_name' => $slug,
          //必要に応じて条件追加
          );
          ・現在のページスラッグを取得
          ・カテゴリの指定はcategory__inではなく、category_nameでスラッグを代入
          という具合です。

          • コーラマン より:

            コード、ありがとうございます。
            早速試してみたいと思います。長々とお時間取らせてしまい申し訳ありませんでした。

          • R3098 より:

            どういたしまして。

  3. みのる より:

    お世話になります。
    特定の固定ページのみに、特定カテゴリーの記事のみを表示させたいのですが、上記の方法は、全ての固定ページに特定カテゴリーの記事が表示されるのでしょうか。

    すみませんご教示いただけますでしょうか。
    よろしくお願いいたします。

    • R3098 より:

      はい、そうなります。
      特定の固定ページのみ表示させるには、下記のような対処が必要です。
      1.ショートコード化
      2.専用の固定ページテンプレートを用意
      3.条件分岐で特定の固定ページを指定
      使いまわしがあるのならショートコード化、それ以外は2~3が手軽だと思います。
      ページID:5に対しての条件分岐ならば次のような形です。
      <?php if(is_page('5')):?>
      上記の記事取得表示用のプログラム
      <?php endif;?>

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.



関連記事