• 解決済 chatm

    (@chatm)


    category-news.phpというページを作って、複数カテゴリーの記事一覧を表示させていますが、ページネーションがうまくいきません。
    ページネーション自体は表示されますが、2ページ目を押すと Notfound になってしまいます。
    原因がお分かりになれば、教えて頂けると助かります。宜しくお願いいたします。

    <div class="news-list">
        <dl>
    <?php
    	$wp_query = new WP_Query();
    	$my_posts = array(
    		'post_type' => 'post',
    		'category_name' => 'news,estate', //スラッグ「news」と「estate」の最新記事の中から5件表示
    		'posts_per_page'=> '5',
    	);
    	$wp_query->query( $my_posts );
    	if( $wp_query->have_posts() ): while( $wp_query->have_posts() ) : $wp_query->the_post(); 
    ?>
    
        <dt><?php the_date('Y/m/d'); //記事の日付表示 ?></dt>
        
        <dd>
        <a href="<?php the_permalink(); ?>"><h2><?php the_title(); //記事のタイトルを表示 ?></h2></a>
        
        <?php
    	add_filter( 'excerpt_length', function ( $length ) {
    	return 50;//記事の抜粋で表示する文字数
    	}, 999 );
    	the_excerpt();
    	?>
        </dd>
        
        <?php endwhile; endif; wp_reset_postdata(); ?>
        
    	</dl>   
    </div><!-- /news-list -->
    
    <div class="pagination pagination-index">
    <?php
        $big = 9999999999;
        $arg = array(
            'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'current' => max( 1, get_query_var('paged') ),
            'total' => $wp_query->max_num_pages,
            'type'    => 'list'
        );
        echo paginate_links( $arg );
    ?>
    
    </div><!-- /pagination -->
3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック投稿者 chatm

    (@chatm)

    以前は固定ページを作って複数カテゴリーの中から新着をリストにしていたのですが、その方法でも今回はページネーションがうまくいかなかったので、他にもいろいろな原因があるのだと思われます。表示設定やphpの名前を変更や、固定ページのテンプレートにしてもうまくいかなかったので。

    なので、このページを「news」カテゴリーの新着情報として扱うことにしました。
    複数のカテゴリーが入るリストですが、他のカテゴリーであっても、投稿記事のカテゴリー選択で、
    「他のカテゴリー」+「news」を必ず選択させるということで、newsの一覧リストとして表示させました。
    投稿記事を入力する時にカテゴリーを複数選択するので、スマートではなくなりますが、ページネーションはできるようになりました。

    複数のカテゴリーを選択するとURLの優先がありますが、Yoast SEOプラグインを入れて、投稿画面でカテゴリーのメインを選択し、記事のアドレスをカテゴリーのメインになるようにしました。

    念のため設定したコードを記載します(前のコードではうまくページ送りできなかったので)

    <div class="news-list">
        <dl>
    <?php
    	$paged = (int) get_query_var('paged');
    	$post_loop = new WP_Query( array(
    	'post_type' => 'post',
    	'category_name' => 'news,estate', //カテゴリースラッグ
    	'posts_per_page' => 5,
    	'paged' => $paged,
     
    	) );if ($post_loop->have_posts()): ?>	
    
    	<?php while ( $post_loop->have_posts() ) : $post_loop->the_post();?>
        <?php get_template_part('module_loop_post'); ?>
    
        <dt><?php the_date('Y/m/d'); ?></dt>
        
        <dd>
        <a href="<?php the_permalink(); ?>"><h2><?php the_title(); ?></h2></a>
        
        <?php
    	add_filter( 'excerpt_length', function ( $length ) {
    	return 50;
    	}, 999 );
    	the_excerpt();
    	?>
        </dd>
        
        <?php endwhile; endif; ?>
        
    	</dl>   
    </div><!-- /news-list -->
    
    <!-- pegenation -->
    <div class="pagination pagination-index">
    
    <?php 
        $big = 9999999999;
        $arg = array(
            'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'current' => max( 1, get_query_var('paged') ),
            'total' => $post_loop->max_num_pages,
            'type'    => 'list'
        );
        echo paginate_links( $arg );
    ?>
    
    </div>
    
    • この返信は2年、 9ヶ月前にchatmが編集しました。

    chatmさん、こんにちは。

    最初のコードでは単純に paged パラメータが足りなかっただけではないでしょうか。
    リファレンスにも

    posts_per_page (整数) – 1ページに含める投稿数(バージョン 2.1 以降で使えます。非推奨になった showposts パラメータを置き換えます)。’posts_per_page’=>-1 を使用するとすべての投稿を含めます(このとき ‘offset’ パラメータは無視されます)。ページ送りを使用するにはこのパラメータと一緒に ‘paged’ パラメータを指定してください。

    とあります。

    ご参考になれば。

    トピック投稿者 chatm

    (@chatm)

    ありがとうございます!
    確かに、
    'paged' => $paged,
    を入れたらページ送りできました。
    どちらのコードでも良いのでしょうかね。

    念のため最初のコードの修正版を下記に記載します

    <div class="news-list">
        <dl>
    <?php
    	$wp_query = new WP_Query();
    	$my_posts = array(
    		'post_type' => 'post',
    		'category_name' => 'news,estate', //スラッグ
    		'posts_per_page'=> '5',
    		'paged' => $paged,
    	);
    	$wp_query->query( $my_posts );
    	if( $wp_query->have_posts() ): while( $wp_query->have_posts() ) : $wp_query->the_post(); 
    ?>
    
        <dt><?php the_date('Y/m/d'); ?></dt>
        
        <dd>
        <a href="<?php the_permalink(); ?>"><h2><?php the_title(); ?></h2></a>
        
        <?php
    	add_filter( 'excerpt_length', function ( $length ) {
    	return 50;
    	}, 999 );
    	the_excerpt();
    	?>
        </dd>
        
        <?php endwhile; endif;//ループ終わり ?>
        
    	</dl>   
    </div><!-- /news-list -->
    
    <!-- pegenation -->
    <div class="pagination pagination-index">
    <?php
        $big = 9999999999;
        $arg = array(
            'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'current' => max( 1, get_query_var('paged') ),
            'total' => $wp_query->max_num_pages,
            'type'    => 'list'
        );
        echo paginate_links( $arg );
    ?>
    
    </div>
    
3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「複数カテゴリーの一覧のページネーション」には新たに返信することはできません。