閲覧している記事と同じタームに属する投稿一覧を表示、かつ指定した件数に満たない場合は不足分を新着記事から補填する方法をご紹介いたします。
おすすめ記事などを表示させたい時に、指定した件数分は常に表示させたい時に役立ちます。
閲覧中の記事と同じタームの投稿一覧を表示し、指定した件数に満たない場合は不足分を新着投稿から補填する
コードは下記の通りです。
‘タクソノミー名’はcategoryやnews_taxなどタクソノミー名を指定してください。下記では表示する件数は3件としていますので、「’posts_per_page’ => 3」と「if ($post_count < 3)」の部分は適宜変更してください。
<?php
$taxonomy_name = 'タクソノミー名';
$tax_terms = get_the_terms($post->ID, $taxonomy_name);
if ($tax_terms) {
$tax_terms_slug = array();
foreach ($tax_terms as $term) {
array_push($tax_terms_slug, $term->slug);
}
}
$args = array(
'post_status' => 'publish',
'post_type' => 'post',
'posts_per_page' => 3,
'post__not_in' => array(get_the_ID()),
'tax_query' => array(
array(
'taxonomy' => $taxonomy_name,
'field' => 'slug',
'terms' => $tax_terms_slug,
'operator' => 'IN'
),
),
);
$query_recommend = new WP_Query($args);
//取得した投稿の数をチェック
$post_count = $query_recommend->post_count;
//取得した投稿が3件未満の場合
if ($post_count < 3) {
//既に取得した投稿のIDを取得(除外リスト)
$existing_post_ids = wp_list_pluck($query_recommend->posts, 'ID');
$existing_post_ids[] = get_the_ID(); //現在の投稿も除外リストに追加
//最新の投稿を追加で取得
$additional_args = array(
'post_type' => 'post',
'posts_per_page' => 3 - $post_count,
'post__not_in' => $existing_post_ids,
'orderby' => 'date',
'order' => 'DESC'
);
$additional_query = new WP_Query($additional_args);
//追加の投稿をマージ
$query_recommend->posts = array_merge($query_recommend->posts, $additional_query->posts);
$query_recommend->post_count = count($query_recommend->posts);
}
if ($query_recommend->have_posts()):
?>
<div class="recommend">
<h2 class="recommend-title">他の投稿を見る</h2>
<ul class="recommend-list">
<?php while ($query_recommend->have_posts()) : $query_recommend->the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>">
<?php if (has_post_thumbnail()) : ?>
<?php the_post_thumbnail(); ?>
<?php endif; ?>
<h2><?php the_title(); ?></h2>
<time datetime="<?php the_time('Y-m-d'); ?>"><?php the_time('Y.m.d'); ?></time>
</a>
</li>
<?php endwhile; ?>
</ul>
</div>
<?php
endif;
wp_reset_postdata();
?>
まずは同じタームの投稿を取得しています。投稿件数が3件に満たない場合は、取得済みの投稿と表示している投稿を除外リストに入れて、不足している件数分の投稿を取得します。
取得した同じタームの投稿一覧と新着投稿の2つをマージして、ループで投稿一覧を表示することで、常に3件表示されるようにしています。
あとがき
同じタームの投稿一覧をおすすめ記事として表示させるケースは結構ありますが、件数不足の時に新着で補填するケースはあまりないかもですね。
ただ、先日クライアントワークで実際に要望いただいて実装したので、また実装することがあるかもしれません。なので備忘録として残しておきます。