カスタム投稿タイプのアーカイブページのうち、タクソノミー(カテゴリーやタグ)ごとのアーカイブページの作り方とページネーションの設定を紹介します。
テンプレートファイル
カスタムタクソノミーごとのアーカイブのテンプレートファイルは、「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に記述を加える必要があります。その方法については下の記事に詳しく解説していますので、ご参照下さい。
タクソノミーアーカイブの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装飾については下の記事で解説していますので、興味のある方はご参照下さい。