この記事ではカスタム投稿のカテゴリー(タクソノミー)ごとに記事を取得する方法についてご紹介・解説・します。
なお、カスタム投稿の追加方法については、下記記事で詳しく解説しています。
カスタムタクソノミーのカテゴリーを取得するとは?
今回想定している取得イメージです。
カスタム投稿タイプの場合、WordPressのデフォルト機能としてある「投稿」とは違う取得の方法となります。
tax_queryというWordPressの関数を使用すると、カスタム投稿で自作したタクソノミー(カスタムタクソノミー)内から条件にあった記事だけを取得する事が可能です。
例えば、cat-shopというカスタムタクソノミーを作成し、カテゴリー分けとして「cat-flower」、「cat-furniture」、「cat-food」などと分けます。この場合、cat-floweだけを取得することができます。
今回紹介するコードの全体像
下記、phpファイル内に記述することで、カスタム投稿で作成したカテゴリーの中身(17行目にある「内容」)を表示することができます。
<?php
$args = array(
'post_type' => 'custom-post',
'posts_per_page' => -1,
'order' => 'DESC',
'tax_query' => array(
array(
'taxonomy' => 'cat',
'terms' => array('catX'),
'field' => 'slug'
),
),
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ): while ( $the_query->have_posts() ): $the_query->the_post(); ?>
<div>内容</div>
<?php endwhile; endif; wp_reset_postdata(); ?>
以下で詳しく解説していきます。
カスタム投稿のカテゴリー取得方法の詳しい解説
カテゴリー取得までの大まかな流れ
下記がおおまかな流れの内容になります。
以降でさらに詳しく解説していきます!
<?php
// 条件の指定
$args = array(
'post_type' => 'custom-post'
);
// クエリの定義
$the_query = new WP_Query( $args );
?>
<!-- 投稿のループ -->
<?php if ( $the_query->have_posts() ): while ( $the_query->have_posts() ): $the_query->the_post(); ?>
<!-- ループする投稿の内容 -->
<div>内容</div>
<!-- ループの終了と投稿データのリセット -->
<?php endwhile; endif; wp_reset_postdata(); ?>
【流れ1】記事を取得するための条件指定
配列$argsに記事を取得するための条件を指定していきます。
$args = array(
'post_type' => 'custom-post', // カスタム投稿タイプ名の指定
'posts_per_page' => -1, // 投稿の取得数の指定
'order' => 'DESC', // 投稿の表示順の指定
'tax_query' => array(
array(
'taxonomy' => 'cat-name', // カスタムタクソノミー
'terms' => array('cat-a'), // カスタムタクソノミーのカテゴリー(タクソノミーターム)
'field' => 'slug'
),
),
);
【流れ2】クエリの定義「WP_Query」
WP_Queryクラスを呼び出してクエリ情報を入手し、$the_queryに情報を入ます。
$the_query = new WP_Query( $args );
【流れ3】取得内容をループさせ、取得内容を表示
取得した内容でwhile文でループさせます。
<?php if ( $the_query->have_posts() ): while ( $the_query->have_posts() ): $the_query->the_post(); ?>
<div>内容</div>
指定した投稿があったら、その投稿を繰り返すという記述です。
【流れ4】ループの終了と投稿データのリセット「wp_reset_postdata」
条件と繰り返しを終了させます。
<?php endwhile; endif; wp_reset_postdata(); ?>
メインループ(本来のループ)に影響を与えないよう、最後にサブループ(今回の取得した条件でのループ)で取得中の投稿情報をリセットするwp_reset_postdata() を必ず実行しましょう。
おまけ:もし記事があった場合にリスト形式で表示
下記のように記述することで、もし記事があった場合にリスト形式で表示させることが可能です。
<?php if ( $the_query->have_posts() ): ?>
<ul>
<?php while ( $the_query->have_posts() ): $the_query->the_post(); ?>
<li>取得内容</li>
<?php endwhile; ?>
</ul>
<?php endif; wp_reset_postdata(); ?>