サポート » 使い方全般 » カテゴリごとの新着記事件数を取得・表示したい

  • 解決済 lady122

    (@luv5ick)


    14日以内に投稿された記事を「新着」としたとき、
    各カテゴリにそれぞれ何件「新着」があるかを数値で表示したいのですが、方法が分かりません。

    希望する表示
    ======================
    ★カテゴリ一覧★
    デザイン[新着3件]
    PHP[新着1件]
    CSS[新着1件]
    ======================

    最初以下のように書き出してみましたが、
    カテゴリは10種類ほどあり、10回これをやるのはスマートではないと思い
    有識者の方の知恵を拝借したく、質問させていただきました。

    <?php
    //新着とする期間
    $newpost = date("Y/m/d",strtotime("-2 week"));
    $design_newpost = 0;
    $args = array(
      'date_query' => array(
         array(
           'inclusive'=>true,
           'cat'=>'design',
           'after'=>$newpost
         ),
      ),
    );
    $the_query = new WP_Query( $args );
    if ( $the_query->have_posts() ) {
    	while ( $the_query->have_posts() ) {
    		$the_query->the_post();
    		$design_newpost++;
    	}
    	echo $design_newpost;
    } 
    ?>

    無知ですみませんが、どなたかご教示いただけますと幸いです。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • こんにちは

    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;
    }
    • この返信は5年、 1ヶ月前にishitakaが編集しました。

    WP_Query のパラメータに 'fields' => 'ids' を加えるとデータ量が少なく(投稿 ID だけの配列に)なりますね。

    トピック投稿者 lady122

    (@luv5ick)

    ishitaka様、gblsm様

    早速の回答ありがとうございます!
    すごくスマートで参考になりました。
    まさか一日で解決できるとは思っていなかったので感激です。

    お二方とも、お忙しい中ご教示いただきありがとうございました!
    希望通りの表示になりましたので解決済みとさせていただきます。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「カテゴリごとの新着記事件数を取得・表示したい」には新たに返信することはできません。