カスタム投稿の記事一覧ページを作成しようと思って、以下のようにWP_Queryを使って実装したところ、ページ送りがうまくできませんでした。2ページ目に移動すると「記事が見つかりません」となり、表示してくれません。
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $args = array( 'paged' => $paged, 'posts_per_page' => 10, ); $wp_query_post = new WP_Query($args); if ($wp_query_post->have_posts()): while($wp_query_post->have_posts()): $wp_query_post->the_post(); ?> <h2><?php echo esc_html($post->post_title); ?></h2> <div class="post-thumbnail"> <?php if( has_post_thumbnail() ): ?> <?php the_post_thumbnail('thumbnail'); ?> <?php else: ?> <img src="<?php echo get_template_directory_uri(); ?>/images/noimage.png"> <?php endif; ?> </div> <div class="post-excerpt"> <?php the_excerpt(); ?> <div class="readmore"><a href="<?php the_permalink(); ?>">続きを読む</a></div> </div> <?php endwhile; ?> <?php else: ?><p>No items</p> <?php endif; wp_reset_postdata(); ?> <!-- ナビゲーション --> <div class="activity-nav"><?php global $wp_rewrite; $paginate_base = get_pagenum_link(1); if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) { $paginate_format = ''; $paginate_base = add_query_arg('paged', '%#%'); } else { $paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') . user_trailingslashit('page/%#%/', 'paged');; $paginate_base .= '%_%'; } echo paginate_links( array( 'base' => $paginate_base, 'format' => $paginate_format, 'total' => $wp_query->max_num_pages, 'mid_size' => 5, 'current' => ($paged ? $paged : 1), )); ?></div> <!-- //ナビゲーション -->
上記の方法で正常に動く場合もあるのですが、今回実装した環境ではなぜか記事が見つからない状態になってしまいました。
原因を調査して修正しようとも思ったのですが、特にWP_Queryにこだわる理由もないため、今回はpre_get_postsを使って一覧ページの記事表示数を調整してみたら、あっという間にページ送りも正常に動くようになりました。pre_get_postsは初めて使ってみたのですが、これかなり便利ですね。もっと早く使っておけばよかった・・・
そんなわけで、pre_get_postsの実装方法について紹介したいと思います。
pre_get_postsを使ってカスタム投稿のアーカイブページの表示記事数を調整する方法
まずは適用しているテーマのfunctions.phpに以下を追加します。
function change_posts_per_page($query) { if ( is_admin() || ! $query->is_main_query() ) { return; } if ( $query->is_post_type_archive('custompostname') ) { $query->set( 'posts_per_page', '10' ); } } add_action( 'pre_get_posts', 'change_posts_per_page' );
「custompostname」の部分には、カスタム投稿名を入れてください。「$query->set( ‘posts_per_page’, ’10’ );」の数字の部分が、1ページに表示する件数の指定です。
アーカイブページ側では、以下のようにWP_Queryの指定を外してあげればOKです。
<?php if(have_posts()): ?> <?php while(have_posts()): the_post(); ?> <h2><?php echo esc_html($post->post_title); ?></h2> <div class="post-thumbnail"> <?php if( has_post_thumbnail() ): ?> <?php the_post_thumbnail('thumbnail'); ?> <?php else: ?> <img src="<?php echo get_template_directory_uri(); ?>/images/noimage.png"> <?php endif; ?> </div> <div class="post-excerpt"> <?php the_excerpt(); ?> <div class="readmore"><a href="<?php the_permalink(); ?>">続きを読む</a></div> </div> <?php endwhile; ?> <?php else: ?><p>No items</p> <?php endif; wp_reset_postdata(); ?> <!-- ナビゲーション --> <div class="activity-nav"><?php global $wp_rewrite; $paginate_base = get_pagenum_link(1); if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) { $paginate_format = ''; $paginate_base = add_query_arg('paged', '%#%'); } else { $paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') . user_trailingslashit('page/%#%/', 'paged');; $paginate_base .= '%_%'; } echo paginate_links( array( 'base' => $paginate_base, 'format' => $paginate_format, 'total' => $wp_query->max_num_pages, 'mid_size' => 5, 'current' => ($paged ? $paged : 1), )); ?></div> <!-- //ナビゲーション -->
あとがき
pre_get_postsの条件指定については、EMiAC-Worksさんの「pre_get_postsを使いこなす!pre_get_posts使い方まとめ」という記事で詳しく解説されているので、カスタム投稿だけでなく他の条件で指定したい場合は、ぜひ参考にしてください。