2026年5月20日

2026年5月20日

WordPressのページネーションが正しく動作しない場合の解決方法

はじめに

ブログ一覧ページで「次のページ」をクリックすると404になる、カスタムループで2ページ目以降が表示されない、previous_posts_link()next_posts_link()が正しく動かない。ページネーションの問題はパーマリンク設定やWP_Queryのpagedパラメータの設定ミスが原因の大半を占めます。

症状・原因

ページネーションが動作しない主な原因:

  • パーマリンク設定の破損:リライトルールが正しく生成されていない
  • フロントページの設定:フロントページを固定ページに設定している場合にpagepagedが競合
  • カスタム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を使います。
  • フロントページを固定ページに設定している場合はpagepagedの使い分けが必要です。

まとめ

ページネーションの問題はパーマリンクの再保存とWP_Queryへのpagedパラメータの追加で解決するケースがほとんどです。カスタムクエリでは必ず$query->max_num_pagespaginate_links()に渡してください。関連記事:WordPressの検索機能が動作しない場合カスタム投稿タイプの設定

お気軽にご相談ください

お見積りへ お問い合わせへ