サポート » 使い方全般 » pre_get_postsで制御したループのクエリ内容が、カテゴリリストに反映されない。

  • 解決済 no23h

    (@no23h)


    お世話になります。

    category.phpのループにpre_get_postsのフックを使って本年度のみの投稿を表示しているのですが、
    その内容がサイドバーのカテゴリ項目に反映されません。

    具体的にはカテゴリ項目に、
    ・本年度の投稿数を表示
    ・投稿がゼロの項目は非表示
    上記2点を反映させたいのですが、
    投稿数は全年の総数が反映され、それに伴ってか2017年度の投稿がゼロのカテゴリ名も表示されてしまいます。

    項目はwp_list_categories()で出力してまして、
    年度制御のようなパラメータがないためよくわからず困っております。
    何か投稿年を結びつけるような方法はありますでしょうか?

    現状のコードはそれぞれ以下になります。
    宜しくお願いいたします。

    category.php

    <?php get_sidebar(); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post();?>
    コンテンツ
    <?php endwhile; endif; ?>

    functions.php

    function change_posts_per_page($query) {
     if ( is_admin() || ! $query->is_main_query() ){
      return;
    }
    $year = date('Y');
    if ( $query->is_category() ) {
      $query->set( 'year' , $year );
      $query->set( 'posts_per_page' , '-1' );
      return;
     }
    }
    add_action( 'pre_get_posts', 'change_posts_per_page' );

    sidebar.php

    <ul class="sidebar">
     <?php $args = array(
      'show_count' => 1, // 投稿数を表示
      'hide_empty' => 1, // 投稿数ゼロのカテゴリ名を非表示
     ); ?>
     <?php wp_list_categories($args); ?>
    </ul>
    • このトピックはno23hが3年前に変更しました。
2件の返信を表示中 - 1 - 2件目 (全2件中)
  • ishitaka

    (@ishitaka)

    こんにちは

    カテゴリーの検索条件に日付はありません。
    wp_list_categories のパラメータの条件にも日付はありませんね。適当なフックもなさそうなので、自前で作成することになるとおもいます。
    wp_list_categories と全く同じ動作をするものを作成するのは、かなりの作業が必要になりそうです。
    下記は簡易的(親カテゴリーに子カテゴリーの投稿数を加味しない等)なものとなりますが、どうでしょうか。

    functions.php 等に

    function my_list_categories( $year, $taxonomy = 'category' ) {
    	$categories = get_categories();
    	$out = '<ul>';
    	foreach ( $categories as $cat ){
    		$count = my_get_count_posts( $year, $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( $year, $term ) {
    	global $wpdb;
    
    	// WP_Query の場合(遅い)
    	//$the_query = new WP_Query( array( 'year' => $year, 'cat' => $term->term_id, 'posts_per_page' => -1 ));
    	//return $the_query->post_count;
    
    	$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 YEAR(p.post_date)=%d AND tt.term_id=%d;",
    		$year,
    		$term->term_id));
    	return $count;
    }
    

    wp_list_categories の代わりに

    my_list_categories( 2017 ); // 年を指定

    ※ 動作確認は行っていないので参考程度にしてください。

    • この返信は3年前にishitakaが編集しました。理由: 誤記
    no23h

    (@no23h)

    ishitaka様

    ご返信ありがとうございます。
    ご提示いただいたコードで希望していたかたちになりました。
    感謝申し上げます!

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「pre_get_postsで制御したループのクエリ内容が、カテゴリリストに反映されない。」には新たに返信することはできません。