• お世話になります。

    カスタム投稿アーカイブで年度別表示をしたいと考えています。

    ただし、カスタム投稿アーカイブでは、タームごとに記事をまとめて出力しています。
    さらにプラグインでカテゴリの順番を入れ替えれるようにしています。

    以下の記述でカスタム投稿をタームごとに表示する事は出来ました。

    <?php
    	$target_post = 'event';
    	$target_post_cat = 'event-cat';
    	$post_count = -1;
    	$cat_args = array(
    	'parent' => 0, //トップレベルのタームのみ
    	'hierarchical' => 0 //子タームを含めない
    	);
    	$cats = get_terms( $target_post_cat, $cat_args );
    	foreach ( $cats as $cat ):
    	?>
    	<?php
    	$target_cat_slug = esc_html( $cat->slug );
    	$target_cat_name = esc_html( $cat->name );
    	?>
    	<?php
    	$year = get_query_var( 'year' );
    	$monthnum = get_query_var( 'monthnum' );
    	$args = array(
    		'post_type' => array( $target_post ),
    		'taxonomy' => $target_post_cat,
    		'term' => $target_cat_slug,
    		'post_status' => 'publish',
    		'posts_per_page' => $post_count, // 表示するページ数
    		'order' => 'DESC', // 並び順
    		'year' => $year,
    		'monthnum' => $monthnum,
    	);
    
    	$my_query = new WP_Query( $args );
    	?>
    	<div class="block-set">
    	<h3><?php echo '【'.$target_cat_name.'】'; ?></h3>
    	<ul>
    	<?php if( $my_query->have_posts() ) : ?>
    	<?php while ( $my_query->have_posts() ) : $my_query->the_post(); ?>
            	<li>
    			<a href="<?php the_permalink(); ?>">
    			<strong><?php echo the_title();	?></strong>
    			</a>
    		</li>
    	<?php endif; ?>
    	<?php endwhile; ?>
    	</ul>
    	<?php endif; ?>
    	</div><!-- /block-set -->
    	<?php wp_reset_postdata(); ?>
    	<?php endforeach; ?>

    function.phpで以下の記述をすることで、年度の対応をおこないました。

    function change_posts_per_page($query) {
      if ( is_admin() || ! $query->is_main_query() ) {
        return $query;
      }
    	if ( is_year() ) {
            $y = get_query_var( 'year' );
            $date_from = $y . '0401';
            $date_to = ( $y + 1 ) . '0331';
            $query->set( 'date_query', array(
                'compare' => 'BETWEEN',
                'after' => $date_from,
                'before' => $date_to,
                'inclusive' => true,
            ) );
            $query->set( 'year', null ); //元々あった年指定を削除
            $query->set('posts_per_page', -1);
        }
        return $query;
      }
    add_action( 'pre_get_posts', 'change_posts_per_page' );

    上記コードを入れたところ、foreachを使わないループで試したところ、年度別の表示になっているようでした。
    しかし、foreachを使ったループでは、年度に関わらず、すべての記事が表示してしまいます。

    スキルも乏しいため、解決方法が見つかりません。
    何が原因かご教示いただければ幸いです。

    よろしくお願いいたします。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • 最初のコードの$yearと$monthnumの中身はなんなんでしょうか。
    中身があるとすれば、すべての記事が表示される理由は何だろう。
    $year年$monthnum月の記事に限定されるんじゃないでしょうか。

    2番目のコードのis_yearは呼び出されるテンプレートが年別の場合に続くコードを実行するなので、
    1番目のコードを書いたテンプレートが該当してるかどうかなのでは。

    pre_get_postsのフックは、呼び出されるテンプレートのメインループを置き換える。
    しかし1番目のコードで、new WP_queryで別のサブループをつくって、それを表示するなので意図したとおりの結果が出ないのでは。

    wordpressのコーデックスの

    • WP_query(ここにいろいろな判定(is_なんちゃら)も記載があります)
    • pre_get_posts
    • テンプレート階層

    のあたりを再読されてはいかがでしょうか。

    とりとめのないレスですいません。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「カスタム投稿アーカイブでの年度別表示」には新たに返信することはできません。