web-dev-qa-db-ja.com

paginate_links()は、カスタムループに余分な空のページを出力します

カスタムループがあります。

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$works = new WP_Query('category_name=work&posts_per_page=9&paged=' . $paged); 

ページ付けは3ページを出力します。最初に9件の投稿があります。これも投稿の総数です。2および3ページには投稿はありません(投稿がない場合はページがないはずです)

これが私のpaginate_links()です。

<?php elseif ( $wp_query->max_num_pages > 1 && ( is_home() || is_archive() || is_search() || is_category() ) ) : // navigation links for home, archive, and search pages ?>

    <?php 
        global $wp_query;

    $big = 999999999;

    echo paginate_links( array(
        'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
        'format' => '?paged=%#%',
        'prev_text' => '',
        'next_text' => '',
        'current' => max( 1, get_query_var('paged') ),
        'total' => $wp_query->max_num_pages
    ) );

    ?>

<?php endif; ?>

デフォルトのループでは、すべて問題ありません。

1

カスタムのWP_Queryを使用して投稿をクエリしますが、ページネーションでは、異なるクエリを含むグローバルな$wp_query変数を使用します。

ページネーションでカスタムクエリ変数$worksを使用するか、ページネーション関数を呼び出す前にグローバル$wp_query変数を変更する必要があります。

あなたはページ付けを出力するために普遍的な機能を使うので、2番目の方法はより良く/より簡単になるでしょう。これを好きですか?

global $wp_query;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$works = new WP_Query('category_name=work&posts_per_page=9&paged=' . $paged);

$original_query = $wp_query;  // store original query for later use
$wp_query = $works;  // overwrite it with your custom query

... your code

... your pagination code

$wp_query = $original_query;  // restore original query
3

カスタムのWP_Query/$worksオブジェクトを使って、paginate_links()引数のデータにアクセスすることもできます。

paginate_links( array(
    'base'      => str_replace( 99999999, '%#%', esc_url( get_pagenum_link( 99999999 ) ) ),
    'format'    => '?paged=%#%',
    'prev_text' => '',
    'next_text' => '',
    'current'   => max( 1, $works->get( 'paged' ) ),
    'total'     => $works->max_num_pages
) );
4
kaiser