こんにちは
14日以内に投稿された記事ということで件数もそれほど多くなることはないと思いますので、WP_Query クラスを使用する方法でもいいかなと思います。
なお、WP_Query クラスのオブジェクトには、$post_count プロパティで投稿数を取得することができます。
例)
functions.php に、
function my_list_categories( $taxonomy = 'category' ) {
$categories = get_categories();
$out = '<ul>';
foreach ( $categories as $cat ){
$count = my_get_count_posts( $cat );
if ( $count > 0 ) {
$out .= '<li><a href="'.get_term_link( $cat->term_id, $taxonomy ).'">' . $cat->name . '</a> [新着 ' . $count . '件]</li>';
}
}
$out .= '</ul>';
echo $out;
}
function my_get_count_posts( $term ) {
$date = date_i18n( 'Y-m-d', strtotime( '-2 week' ) );
$the_query = new WP_Query( array(
'posts_per_page' => -1,
'post_type' => 'post',
'cat' => $term->term_id,
'date_query' => array( array( 'after' => $date ) )
) );
return $the_query->post_count;
}
テンプレートに、
<?php my_list_categories(); ?>
件数が多い場合は、my_get_count_posts 関数を下記のように SQL クエリ―で取得するように変更するといいかなと思います。
function my_get_count_posts( $term ) {
global $wpdb;
$date = date_i18n( 'Y-m-d', strtotime( '-2 week' ) );
$count = $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts p " .
"INNER JOIN $wpdb->term_relationships tr ON (p.ID=tr.object_id) " .
"INNER JOIN $wpdb->term_taxonomy tt ON (tr.term_taxonomy_id=tt.term_taxonomy_id) " .
"WHERE p.post_status='publish' AND p.post_type='post' AND tt.term_id=%d AND p.post_date>='%s'",
$term->term_id,
$date
) );
return $count;
}
WP_Query のパラメータに 'fields' => 'ids'
を加えるとデータ量が少なく(投稿 ID だけの配列に)なりますね。
ishitaka様、gblsm様
早速の回答ありがとうございます!
すごくスマートで参考になりました。
まさか一日で解決できるとは思っていなかったので感激です。
お二方とも、お忙しい中ご教示いただきありがとうございました!
希望通りの表示になりましたので解決済みとさせていただきます。