WordPressの投稿記事一覧取得の時に「複数カテゴリに属する記事を〇件づつ取得し表示する」カスタマイズです。
指定したカテゴリーの記事を、例えば3件づつ取得し、一覧は各カテゴリが混ざった状態で、公開日順に表示する。
例えば
- 【a-catgory】:記事3件取得
- 【d-catgory】:記事3件取得
- 【f-catgory】:記事3件取得
合わせて9件の記事を公開日、降順に一覧表示する。
- 20XX年08月13日【a-catgory】XXXXXXXXXXXXXXXXXX
- 20XX年07月13日【d-catgory】XXXXXXXXXXXXXXXXXX
- 20XX年07月10日【a-catgory】XXXXXXXXXXXXXXXXXX
- 20XX年06月28日【f-catgory】XXXXXXXXXXXXXXXXXX
- 20XX年06月25日【d-catgory】XXXXXXXXXXXXXXXXXX
- 20XX年06月20日【d-catgory】XXXXXXXXXXXXXXXXXX
- 20XX年06月09日【a-catgory】XXXXXXXXXXXXXXXXXX
- 20XX年06月04日【f-catgory】XXXXXXXXXXXXXXXXXX
- 20XX年06月01日【f-catgory】XXXXXXXXXXXXXXXXXX
tax_queryでカテゴリごと件数を指定はできない
複数カテゴリで記事を絞り込むのでtax_queryを利用すれば良いのかと思っていました。
関数リファレンスを調べてみると、tax_queryの検索条件のパラメーターには、件数の取得ができません。
tax_queryで絞り込んた記事に対してしか、絞り込みできないようです。
カテゴリごとに取得した投稿IDから一覧を取得する
各カテゴリごとに3件ずつの投稿IDを取得します。
以下、未検証ですので、考え方だけ・・・
<?php
$postids = []; // 配列初期化
$args = array(
'post_type' => array('post'),
'posts_per_page' => 3,
'category_name=' => 'a-catgory',
);
$query = new WP_Query( $args );
if( $query->have_posts() ) :
?>
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
<?php $postids[] = get_the_ID(); // 配列に追加 ?>
<?php endwhile; endif; ?>
<?php wp_reset_postdata(); ?>
<?php
$args = array(
'post_type' => array('post'),
'posts_per_page' => 3,
'category_name=' => 'd-catgory',
);
$query = new WP_Query( $args );
if( $query->have_posts() ) :
?>
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
<?php $postids[] = get_the_ID(); // 配列に追加 ?>
<?php endwhile; endif; ?>
<?php wp_reset_postdata(); ?>
//同様にf-catgoryも取得
対象の投稿ID全て配列$postidsに格納します。
WP_Queryで投稿ID$postidsを指定して記事情報を取得します。
$args = array(
'post_type' => 'post',
'post__in' => $postids, // 表示したい投稿ID
'post_status' => array('publish'),
'order'=> 'desc',
'orderby'=> 'post_date'
);
$query = new WP_Query($args);
ソートについては「投稿日」の「降順」にしています。
if($query->have_posts()):
while($query->have_posts()):
$query->the_post(); ?>
<a href="<?php echo get_permalink(); ?>">
<time class="date" datetime="<?php the_time('Y-m-d'); ?>"><?php the_time('Y.m.d') ?></time>
<?php
$cats = get_the_category();
foreach($cats as $cat):
?>
<span class="category">
<?php echo esc_html($cat->name); ?>
</span>
<?php
endforeach;
?>
<h2><?php the_title(); ?></h2>
</a>
<?php
endwhile;
else:
echo '投稿はありません';
endif;
wp_reset_postdata();
?>
カテゴリの登録数が少ない場合は、合計9件にならない場合もあります。
複数カテゴリに属する記事を3件づつ取得し、統合して一覧表示できました。
しかし一覧にすると時系列的にあるはずの記事が抜けているように感じられ違和感がありますね・・・
tax_queryで9件表示するか、カテゴリーごとに3件づつ表示の方が良いかと思います。
コメント