2026年5月20日
2026年5月20日
WordPressのページネーションが正しく動作しない場合の解決方法
はじめに
ブログ一覧ページで「次のページ」をクリックすると404になる、カスタムループで2ページ目以降が表示されない、previous_posts_link()とnext_posts_link()が正しく動かない。ページネーションの問題はパーマリンク設定やWP_Queryのpagedパラメータの設定ミスが原因の大半を占めます。
症状・原因
ページネーションが動作しない主な原因:
- パーマリンク設定の破損:リライトルールが正しく生成されていない
- フロントページの設定:フロントページを固定ページに設定している場合に
pageとpagedが競合 - カスタムWP_Queryで
paged未設定:pagedパラメータを指定していない query_posts()の使用:query_posts()はメインクエリを上書きしページネーションが壊れる
解決手順
ステップ1:パーマリンクを再保存する
wp rewrite flush --hard
ステップ2:フロントページのページネーション修正
フロントページを固定ページに設定している場合はpageではなくpagedを使います。
// functions.php — フロントページのページネーション修正
add_action('pre_get_posts', function($query) {
if ($query->is_home() && $query->is_main_query()) {
$query->set('paged', get_query_var('paged') ?: 1);
}
});
ステップ3:カスタムWP_Queryで正しくページネーションを実装する
// page.php など — カスタムループの正しい実装
$paged = get_query_var('paged') ?: (get_query_var('page') ?: 1);
$args = [
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged, // これが重要
];
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
// 投稿を表示
endwhile;
// ページネーションのリンク($query を渡す)
echo paginate_links([
'base' => str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999))),
'format' => '?paged=%#%',
'current' => max(1, $paged),
'total' => $query->max_num_pages,
]);
wp_reset_postdata();
endif;
ステップ4:query_posts()をpre_get_postsに置き換える
// 悪い例(query_posts はページネーションを壊す)
query_posts('posts_per_page=5');
// 良い例(pre_get_posts でメインクエリを変更)
add_action('pre_get_posts', function($query) {
if (!is_admin() && $query->is_main_query() && $query->is_home()) {
$query->set('posts_per_page', 5);
}
});
ステップ5:固定ページ内のカスタムページネーション
固定ページ(page_on_frontが設定されているページ)での2ページ目以降は/page/2/ではなく/?page=2形式になる場合があります。
// 固定ページでのpaged取得
$paged = get_query_var('page') ?: 1; // pageを使う(pagedではない)
ステップ6:next_posts_link/previous_posts_linkに総ページ数を渡す
// カスタムクエリの場合は $query->max_num_pages を渡す
next_posts_link('次のページ →', $query->max_num_pages);
previous_posts_link('← 前のページ');
注意事項
query_posts()はWordPressのメインクエリを壊すため使用しないでください。代わりにpre_get_postsを使います。- フロントページを固定ページに設定している場合は
pageとpagedの使い分けが必要です。
まとめ
ページネーションの問題はパーマリンクの再保存とWP_Queryへのpagedパラメータの追加で解決するケースがほとんどです。カスタムクエリでは必ず$query->max_num_pagesをpaginate_links()に渡してください。関連記事:WordPressの検索機能が動作しない場合、カスタム投稿タイプの設定