【WordPress】タクソノミーアーカイブとページネーションの作成【一覧ページ|taxonomy.php|カスタム投稿タイプのカテゴリーアーカイブ】

カスタム投稿タイプのアーカイブページのうち、タクソノミー(カテゴリーやタグ)ごとのアーカイブページの作り方とページネーションの設定を紹介します。

目次

テンプレートファイル

カスタムタクソノミーごとのアーカイブのテンプレートファイルは、「taxonomy.php」です。このファイルがないと表示できませんので、まずは作って下さい。

テンプレートファイル

taxonomy.php

捕捉

WordPressのテンプレートヒエラルキーによれば、「taxonomy.php」が無い時は、「archaive.php」がカスタムタクソノミーアーカイブのテンプレートになります。しかし、「archaive.php」を他のアーカイブページと共用することは実際かなり難しいと思います。

パーマリンク(URL)

初期設定のパーマリンク

たとえば、下記のような条件の場合、

  • トップページ:https://hoge.com
  • カスタム投稿タイプ:area
  • カスタムタクソノミー:area_cat
  • ターム :tokyo

初期設定の状態では下記のようになります。

https://hoge.com/area_cat/tokyo/

捕捉:パーマリンクの改造について

このままでも良いのですが、コーダーの中には気になる人も一定数いるようで、下記のように表示される設定に改造している人もいます。

https://hoge.com/area/tokyo/

こちらの方がカスタム投稿タイプのアーカイブのURL(下記)とも整合性がとれて自然に見えますね。

https://hoge.com/area/

このようなパーマリンクの改造にはfunctions.phpに記述を加える必要があります。その方法については下の記事に詳しく解説していますので、ご参照下さい。

あわせて読みたい
【WordPress】タクソノミーアーカイブのパーマリンク(URL)の変更方法【カテゴリー一覧】 カスタム投稿のカテゴリー一覧ページのURLは初期設定のままでは違和感がありますので、カスタマイズする方法を紹介します。 タクソノミーアーカイブの初期設定のパーマ...

タクソノミーアーカイブのPHP記述例

記事一覧とページネーションのPHP記述例

タクソノミーアーカイブ、つまりカスタム投稿タイプのカテゴリー別記事一覧ページのPHP記述例を下に載せておきます。

<!-- ページタイトル -->
<h1 class="hoge"><?php single_term_title(); ?></h1>

<!-- 記事一覧-->
<ul class="news-info_wrapper">
  <!-- 基本設定 -->
  <?php
  $paged = get_query_var('paged') ? get_query_var('paged') : 1;
  $term_object = get_queried_object(); // 関数化:クエリの情報オブジェクトを取得
  $term_slug   = $term_object->slug; // 関数化:タームのスラッグ取得
  $args = array(
    'post_type' => 'works', //カスタム投稿タイプのスラッグ(functions.phpで設定している)
    'paged' => $paged, // 何ページ目の情報を取得するかを指定
    'taxonomy' => 'works-cat', // カスタムタクソノミーのスラッグ(functions.phpで設定している)
    'term' => $term_slug, // ターム(カテゴリー)のスラッグ
    'posts_per_page' => 5 // 表示件数(-1は全件表示)
  );
  // 記事ループ
  $the_query = new WP_Query($args);
  if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post(); ?>
      <li class="hoge">
        <!-- パーマリンク -->
        <a href="<?php the_permalink(); ?>" class="hoge">
          <div class="service-img-wrapper">
            <!-- サムネイル -->
            <?php the_post_thumbnail('medium'); ?>
          </div>
          <!-- タイトル -->
          <h2 class="hoge"><?php the_title(); ?></h2>
          <!-- 抜粋 -->
          <p class="hoge"><?php the_excerpt(); ?></p>
          <!-- 投稿日 -->
          <p class="hoge"><?php the_time('Y年n月j日') ?></p>
        </a>
      </li>
    <?php endwhile; ?>
  <?php else : ?>
    <p>投稿がありませんでした。</p>
  <?php endif; ?>
  <?php wp_reset_postdata(); ?>
</ul>

<!-- ページネーション全体 -->
<div class="post-pagination-wrapper">
  <?php
  $args = array(
    'type' => 'list',
    'current' => $paged,
    'total' => $the_query->max_num_pages,
    'prev_text' => '<',
    'next_text' => '>',
  );
  echo paginate_links($args);
  ?>
</div>

なお、このコードだけではページネーションがバグるため、functions.phpに一筆書く必要があります。それについては、下の方のページネーションの解説箇所で紹介しています。

では、パーツ別に説明していきます。

タイトル部分:カテゴリー名

ページタイトルには、一覧ページのカテゴリー名(ターム名)を表示させるのが自然です。下記コードをそのままコピペすれば、h1タグにカテゴリー名が入ります。

// タイトル:ターム名(カテゴリー名)
<h1 class="hoge"><?php single_term_title(); ?></h1>
コード解説
  • シンプルに<?php single_term_title( ); ?>と直接書けばタクソノミー名を表示することができます。

記事一覧ループの基本設定

ここで記事一覧表示とページネーションのための基本設定を行います。

<!-- 記事一覧-->
<ul class="news-info_wrapper">
  <!-- 基本設定 -->
  <?php
  $paged = get_query_var('paged') ? get_query_var('paged') : 1;
  $term_object = get_queried_object(); // 関数化:クエリの情報オブジェクトを取得
  $term_slug   = $term_object->slug; // 関数化:タームのスラッグ取得
  $args = array(
    'post_type' => 'works', //カスタム投稿タイプのスラッグ(functions.phpで設定している)
    'paged' => $paged, // 何ページ目の情報を取得するかを指定
    'taxonomy' => 'works-cat', // カスタムタクソノミーのスラッグ(functions.phpで設定している)
    'term' => $term_slug, // ターム(カテゴリー)のスラッグ
    'posts_per_page' => 5 // 表示件数(-1は全件表示)
  );
  // 記事ループ
  $the_query = new WP_Query($args);
  if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post(); ?>

コメントアウトを見ていただければ理解できると思いますが、ご自分用に変更すべき箇所は下記3点のみです。

変更すべき箇所
  • カスタム投稿タイプのスラッグ(9行目): 例えば、スラッグがworksの場合は、’post_type’ => ‘works‘と書いて下さい。
  • カスタムタクソノミーのスラッグ(11行目):例えば、スラッグがworks-catの場合は、’taxonomy’ => ‘works-cat‘と書いて下さい。
  • 表示件数(13行目):例えば、表示件数を5件にしたい場合は、’posts_per_page’ => 5と書いて下さい。全件表示の場合は、数字の部分を-1に変更して下さい。
コード解説

他のアーカイブページと異なる点は、下記(6-7行目)のようにタームのスラッグを取得しており、

  $term_object = get_queried_object(); // 関数化:クエリの情報オブジェクトを取得
  $term_slug   = $term_object->slug; // 関数化:タームのスラッグ取得

そこで関数宣言したタームスラッグ($term_slug)を下記(12行目)に代入し、ループで呼び出すタームを限定している点です。

'term' => $term_slug, // ターム(カテゴリー)のスラッグ

記事一覧のループ部分

<ul class="news-info_wrapper">
<!-- 中略 -->
  
<!-- 記事のループ -->
  $the_query = new WP_Query($args);
  if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post(); ?>
      <li class="hoge">
        <!-- パーマリンク -->
        <a href="<?php the_permalink(); ?>" class="hoge">
          <div class="service-img-wrapper">
            <!-- サムネイル -->
            <?php the_post_thumbnail('medium'); ?>
          </div>
          <!-- タイトル -->
          <h2 class="hoge"><?php the_title(); ?></h2>
          <!-- 抜粋 -->
          <p class="hoge"><?php the_excerpt(); ?></p>
          <!-- 投稿日 -->
          <p class="hoge"><?php the_time('Y年n月j日') ?></p>
        </a>
      </li>
    <?php endwhile; ?>
  <?php else : ?>
    <p>投稿がありませんでした。</p>
  <?php endif; ?>
  <?php wp_reset_postdata(); ?>
</ul>
コード解説

記事ループ部分は他のアーカイブページとまったく同じです。

上の例で読み込み・書き出ししている項目と使っているWordPress関数は下記のとおりです。

  • パーマリンク(9行目):the_permalink();
  • サムネイル(12行目):the_post_thumbnail(‘medium’);
  • 記事タイトル(15行目):the_title();
  • 抜粋(17行目):the_excerpt();
  • 投稿日(19行目):the_time(‘Y年n月j日’)

ページネーションの設定

ページネーションのPHP記述例は下記のとおりで、すべてのアーカイブページで共通です。

<!-- ページネーション -->
<div class="post-pagination-wrapper">
  <?php
  $args = array(
    'type' => 'list',
    'current' => $paged,
    'total' => $the_query->max_num_pages,
    'prev_text' => '<',
    'next_text' => '>',
  );
  echo paginate_links($args);
  ?>
</div>

ただし、このままでは2ページ目以降が404ページになってしまうため、functions.phpの下記コードを加える必要があります。

// -----------------------------------------------------------------
// タクソノミーアーカイブ投稿でページネーションを使う設定
// -----------------------------------------------------------------
function change_posts_per_page($query) {
  if ( is_admin() || ! $query->is_main_query() ) {
    return;
  }
  if ( $query->is_tax( 'タクソノミースラッグ' ) ) { //タクソノミースラッグを記入
  $query->set( 'posts_per_page', '表示件数' ); //表示件数を記入
  }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );

例えば、タクソノミースラッグがworks-cat、表示件数が5件の場合には下記のように書きます。

// -----------------------------------------------------------------
// タクソノミーアーカイブ投稿でページネーションを使う設定
// -----------------------------------------------------------------
function change_posts_per_page($query) {
  if ( is_admin() || ! $query->is_main_query() ) {
    return;
  }
  if ( $query->is_tax( 'works-cat' ) ) { //タクソノミー名を設定
  $query->set( 'posts_per_page', '5' ); //表示件数を設定
  }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );

ページネーションのCSS装飾については下の記事で解説していますので、興味のある方はご参照下さい。

あわせて読みたい
【WordPress】投稿アーカイブのページネーションの作り方 投稿アーカイブページのページネーションの作り方を紹介します。 完成イメージ WordPressでは投稿アーカイブページのページネーション用のコードが最初から用意されてい...

関連記事

カスタムタクソノミーのfunctions.php設定

あわせて読みたい
【WordPress】カスタム投稿タイプにカテゴリーとタグを追加する方法【カスタムタクソノミー】 カスタム投稿タイプのカスタムタクソノミー(カテゴリーとタグ)はfunctions.phpに設定を記述しないと使うことができません。この記事ではWordPressのカスタム投稿タイ...

投稿アーカイブの作り方|archive.php

あわせて読みたい
WordPress|記事一覧ページの作り方|archive.php 記事一覧ページの機能 この記事で紹介する記事一覧ページ(archive.php)に付属する機能は下記のとおりです。 機能一覧 記事タイトル・投稿日・カテゴリー名・サムネイ...

カテゴリーアーカイブの作り方|category.php

あわせて読みたい
WordPress|カテゴリーアーカイブとページネーションの作り方|category.php WordPressカテゴリーアーカイブの作り方を紹介します。パーマリンク、テンプレートファイル名、見本コードなど。

カスタム投稿アーカイブの作り方|archive-$posttype.php

あわせて読みたい
【WordPress】カスタム投稿タイプのアーカイブの作り方【一覧ページ|archive-$posttype.php】 カスタム投稿タイプ一覧ページの作り方を紹介します。テンプレートファイル、アーカイブのURL、ループ構造のPHP記述例、ページネーションなど。 テンプレートファイル ...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

■清水WEB制作代表
■コーディング:WordPress(オリジナルテーマ制作等)・HTML・Sass・FLOCSS・JavaScript(jQuery)等
■集客力:YouTube/Instagram/ブログでそれぞれ登録者数16000人/フォロワー13000人/月間最大アクセス50000PVの集客実績があります
■文章作成:博士号所有、会社員時代は科学雑誌に寄稿していたので文章作成も得意です
■写真技術:Amazon Kindle出版で、写真集・撮影編集解説書を5冊好評発売中です

目次