ここでは、カスタム投稿タイプの個別投稿を表示させたときに、そのページと同じタームの記事一覧を自動表示させる方法について見ていきます。
カスタム投稿タイプのターム記事一覧を自動表示させるコード
PHP
<?php global $post; $post_id = $post->ID; $post_type = get_post_type(); $taxonomy = 'タクソノミースラッグ'; //タクソノミーを指定 $term = get_the_terms($post_id, $taxonomy); $term_slug = $term[0]->slug; $custom_posts = get_posts(array( 'post_type' => $post_type, 'posts_per_page' => 6, // 表示件数 'orderby' => 'date', // 表示順の基準 'order' => 'DESC', // 昇順・降順 'exclude' => $post_id, // 表示中の投稿を除外 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term_slug, 'operator' => 'IN' ), ) )); $count = count($custom_posts); if($count>=1): foreach($custom_posts as $post): setup_postdata($post); ?> <!-- ループはじめ --> <h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3> <p><?php the_time('Y/m/d') ?></p> <p><?php the_excerpt(); ?></p> <!-- ループおわり --> <?php endforeach; wp_reset_postdata(); else: ?> <p>記事がありません。</p> <?php endif ?>
コードの解説
下記のコードのうち説明を見たい行をクリックすると説明文が開きます。
- <?php
- global $post;
-
$post
というのは、WordPressに最初から入っている変数のひとつで、表示中の投稿に関するいろんな情報(配列)が入っているグローバル変数です。$post
をこの後、使用するのでそれに先立ち「グローバル宣言」を行います。 - $post_id = $post->ID;
-
$post->ID
は、グローバル変数$post
の中から現在の投稿のIDを取得します。これを変数$post_id
に代入します。 - $post_type = get_post_type();
-
get_post_type()
は、現在の投稿の投稿タイプを取得する関数です。この値を$post_type
に代入します。 - $taxonomy = ‘タクソノミースラッグ’; //タクソノミーを指定
-
記事を一覧表示させたいタクソノミーのスラッグを変数
$taxonomy
に代入します。「タクソノミースラッグ」のところをスラッグに置き換えてください。 - $term = get_the_terms($post_id, $taxonomy);
-
get_the_terms()
は、タームの情報を配列で取得する関数です。get_the_terms(投稿ID, タクソノミー)
このような形で取得したいタームの「タクソノミー」と「投稿ID」を引数で指定します。ここでは、投稿IDには
$post->ID
が格納された変数$post_id
を、タクソノミーには先ほど値を代入した変数$taxonomy
を入れます。これで、変数$term
には、表示中の投稿に関連するタームの情報が配列として格納されます。 - $term_slug = $term[0]->slug;
-
$term[番号]->slug;
これで変数
$term
に格納されたタームの中から、キーが[0](つまり最初の)タームのスラッグが取得されます。1つの投稿に複数のタームが登録されている場合、ターム名(スラッグではなく)の「あいうえお順」で配列されます。ここでは、2番目以降のターム([1], [2], [3],…)については扱いませんので、都合が悪い場合は自力でカスタマイズをしてください。
- $custom_posts = get_posts(array(
-
get_posts()
は、投稿の一覧を表示させるときに使うお決まりの関数で、取得したい記事の設定を行います。全体の骨組みは下記のようになります。PHP
<?php $custom_posts = get_posts(array( // 取得する投稿の設定 )); global $post; if($custom_posts): foreach($custom_posts as $post): setup_postdata($post); ?> // ループで設定した投稿データを出力 <?php endforeach; endif; wp_reset_postdata(); ?>
「取得する投稿の設定」のところで取得したい投稿の設定を行い、それを「ループで設定した投稿データを出力」のところで出力します。上記の骨組みは公式のようなものなので覚えてしまっても良いかもしれません。
ここでは、取得したい記事の設定を変数
$custom_posts
に代入しています。 - ‘post_type’ => $post_type,
-
投稿タイプの指定を行います。ここでは投稿タイプのスラッグが格納されている変数
$post_type
を指定します。 - ‘posts_per_page’ => 6, // 表示件数
-
'posts_per_page' => 6,
は投稿の表示件数の指定です。「6」のところを表示させたい投稿数に入れ替えてください。 - ‘orderby’ => ‘date’, // 表示順の基準
-
データをある特定の規則に従って並べ替えることを「ソートする」というのですが、
orderby
では、記事をどんな項目に沿ってソートさせるかを決めます。代表的な項目として下記があります。順序づけパラメータ 意味 date 投稿日 modified 更新日 name スラッグ rand ランダム ID 投稿ID(大文字です) title タイトル - ‘order’ => ‘DESC’, // 昇順・降順
-
order
では、orderby
で指定した項目を昇順(ACB順)で並べるのか、降順(ACB順の反対)で並べるのかを指定できます。ASC: 昇順
DESC: 降順ちなみに初期値は、
'DESC'
になっていますので、このままで良い場合は行をまるごと削除してしまってかまいません。 - ‘exclude’ => $post_id, // 表示中の投稿を除外
-
表示中の投稿が記事一覧に表示されないよう、ここで
'exclude' => $post_id
として現在の投稿IDを除外します。 - ‘tax_query’ => array(
-
tax_query
では、表示させたいカスタムタクソノミーの投稿に関する設定を行います。下記がその骨組みになります。'tax_query' => array( array( // 投稿の設定 ), )
- array(
-
array
は、配列を作るときに使われる関数です。
array("要素1", "要素2", "要素3");
という形で配列を作ります。 - ‘taxonomy’ => $taxonomy,
-
'taxonomy' => $taxonomy,
は、タクソノミーをスラッグで指定する部分です。先ほど、タクソノミーのスラッグを格納した変数を入れます。 - ‘field’ => ‘slug’,
-
'field' => 'slug',
の部分は、タームをどういう形式で指定するかを決めます。ここではスラッグで指定しますが、他にも下記のような値が使えます。パラメータ 使える値 説明 field term_id(初期値) タームのID slug スラッグ name タームの名前です。
ほとんどの場合、日本語になっていますよね。term_taxonomy_id term_id
と同じです。このパラーメータは、初期値の場合は省略が可能です。
- ‘terms’ => $term_slug,
-
'terms' => $term_slug
では投稿の一覧を表示させたいタームを指定します。先ほど、タームのスラッグを格納しておいた変数$term_slug
を入れます。 - ‘operator’ => ‘IN’
-
'operator' => 'IN',
の部分は、指定したタームに対してどういう絞り込みを行うかを指定します。ここでは、'IN'
で「いずれかに一致(or)」になっていますが、他にも下記のような値が指定できます。パラメータ 使える値 説明 operator IN(初期値) いずれかに一致するターム NOT IN いずれにも一致しないターム AND すべてが一致するターム このパラメータも初期値の場合、省略が可能です。
- ),
- )
- ));
- $count = count($custom_posts);
-
条件に合った投稿数を
$count
に代入します。投稿数を取得するには、配列の数を返すcount()
の引数に投稿の配列$custom_posts
を入れます。 - if($count>=1): foreach($custom_posts as $post): setup_postdata($post); ?>
-
if(条件): foreach(変数 as $post): setup_postdata($post);
の部分は、「もし条件を満たしている場合は、グローバル変数$post
へ投稿として記事を1つずつセットします」みたいな意味です。ここでは、「条件」として該当する投稿が存在すること、つまり投稿数が1つ以上あることを条件にするので、投稿数が格納された変数
$count
を($count>=1)
という形でif文の条件に入れます。foreach文は、
foreach(配列変数 as 変数): // 処理する内容 endforeach
という形で「配列変数」に格納されている投稿のまとまりを一つずつ「変数(この場合
$post
)」として取り出すという働きをします。 - <!– ループはじめ –>
- <h3><a href=”<?php the_permalink() ?>”><?php the_title(); ?></a></h3>
- <p><?php the_time(‘Y/m/d’) ?></p>
- <p><?php the_excerpt(); ?></p>
- <!– ループおわり –>
- <?php endforeach; wp_reset_postdata(); else: ?>
-
endforeach
でforeach文の終了、wp_reset_postdata()
でsetup_postdata($post);
のところで変更した$post
の投稿に関する情報をリセットしています。else
の下には、if($count>=1):
で条件に該当しなかった(投稿が存在しなかった)場合の内容が入ります。 - <p>記事がありません。</p>
- <?php endif ?>
-
endif
は、if文の終了です。
カスタム投稿タイプの複数のタクソノミーから絞り込み記事一覧を自動表示させるコード
例えば、カスタム投稿タイプに2つのタクソノミーが登録されている場合に、両方のタクソノミーのタームが一致する場合に自動でその投稿を一覧表示させたい場合は下記のようになります。
PHP
<?php global $post; $post_id = $post->ID; $post_type = get_post_type(); $taxonomy01 = 'タクソノミースラッグ1'; //タクソノミー1を指定 $term01 = get_the_terms($post_id, $taxonomy01); $term_slug01 = $term01[0]->slug; $taxonomy02 = 'タクソノミースラッグ2'; //タクソノミー2を指定 $term02 = get_the_terms($post_id, $taxonomy02); $term_slug02 = $term02[0]->slug; $custom_posts = get_posts(array( 'post_type' => $post_type, 'posts_per_page' => 6, // 表示件数 'orderby' => 'date', // 表示順の基準 'order' => 'DESC', // 昇順・降順 'exclude' => $post_id, // 表示中の投稿を除外 'tax_query' => array ( 'relation' => 'AND', //タクソノミー同士の関係を指定 array ( 'taxonomy' => $taxonomy01, 'field' => 'slug', 'terms' => $term_slug01, 'operator' => 'IN' ), array ( 'taxonomy' => $taxonomy02, 'field' => 'slug', 'terms' => $term_slug02, 'operator' => 'IN' ) ) )); $count = count($custom_posts); if($count>=1): foreach($custom_posts as $post): setup_postdata($post); ?> <!-- ループはじめ --> <h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3> <p><?php the_time('Y/m/d') ?></p> <p><?php the_excerpt(); ?></p> <!-- ループおわり --> <?php endforeach; wp_reset_postdata(); else: ?> <p>記事がありません。</p> <?php endif ?>
以上が、表示中のカスタム投稿タイプのターム記事一覧を自動で表示させる方法でした。