web-dev-qa-db-ja.com

ページ付けされたページは正しいコンテンツを表示していますが、ページ付けリンクは正しくありません

静的フロントページに投稿を表示するためにカスタムのWP_Queryを使用しています。 paginate_links関数を使って 番号付きページネーションリンク を生成する。これは私が持っているコードです...

$latest_args = array(
    'post_type' => 'post',
    'category__not_in' => array( 3 ),
    'ignore_sticky_posts' => 1,
    'paged' => $paged,
);

$latest_query = new WP_Query( $latest_args );

if ( $latest_query->have_posts() ) :

    while ( $latest_query->have_posts() ) : $latest_query->the_post();
        get_template_part( 'content', get_post_format() );
    endwhile;

    if ( $latest_query->max_num_pages > 1 ) :
        $big = 999999999;
        echo '<div class="pagination">';
        echo paginate_links( array(
            'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'format' => '?paged=%#%',
            'current' => max( 1, get_query_var('paged') ),
            'total' => $latest_query->max_num_pages
        ) );
        echo '</div>';
    endif;

endif;

wp_reset_postdata();

しかし、これをstatic front pageで使用すると、他のすべてのページにも常に最初のページのコンテンツが表示されます。しかし、クエリ codexで提案されているように にpagedパラメータを追加することで修正されました。

if ( get_query_var('paged') ) {
  $paged = get_query_var('paged');
} elseif ( get_query_var('page') ) {
  $paged = get_query_var('page');
} else {
  $paged = 1;
}

ページ付けされたページの重複したコンテンツは修正されましたが、番号ベースのページ区切りリンクは常に最初のページに固定されます。常に最初のリンク(1)が現在のリンクとして表示され、残りのページを閲覧するのが難しくなります。

static front page以外のページで使用した場合、このコードは問題なく動作します。

この問題に対するあらゆる解決策。

編集:更新

すべてのプラグインを無効にしてfunctions.phpからすべてのカスタム開発関数を削除しようとしましたが、それでも問題は解決しません。だから私はこれが私がWP_Queryまたはpaginate_links関数を使っている方法で何かをする必要があると思います。

このコードには間違いがあるはずです。

1
Robert hue

静的ページはpagedクエリ変数では動作しません。page変数が必要です。

これが、2番目のコードブロックがクエリを機能させる理由です。利用可能な場合はpage varを使用します。

ただし、ページ付けされたリンクコードは常にpagedを使用します。

...
'format' => '?paged=%#%',
...

だからpaged query varを送っていますが、page varを探しています。

解決策は、静的ページから使用する場合は、format引数にpage query varを送信させることです。

if ( $latest_query->max_num_pages > 1 ) :

    $var = is_page() ? 'page' : 'paged'; // <-- choose var here   

    $big = 999999999;
    echo '<div class="pagination">';
    echo paginate_links( array(
        'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),

        'format' => '?' . $var . '=%#%', // <-- use var here  

        'current' => max( 1, get_query_var($var) ), // <-- use var here 
        'total' => $latest_query->max_num_pages
    ) );
    echo '</div>';
endif;

テストされていません

3
gmazzap