web-dev-qa-db-ja.com

ページごとのカスタム投稿はページ付けでは機能ません

独自のposts_per_pageを設定したいテンプレートが1ページあります。これが私が使ったコードです:

<?php
global $query_string;
query_posts($query_string . '&posts_per_page=4'); 
if ( have_posts() ) : while ( have_posts() ) : the_post();
...

これで、このコードは1ページあたり4項目のみを制限し、私が書いたように以下のpageinate_linksを示します。しかし他のページをクリックすると404が表示されます。

Globalとquery_postsの行を削除すれば、うまくいきます。

これは私が使っているpaginate_links関数です:

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

条件付きタグ を指定してpre_get_postsfunctions.php アクションを使用し、query_postsへの呼び出しを削除します。

function wpa62751_pre_get_posts( $query ) {
    if ( is_category( 'my-category' ) && is_main_query() )
        $query->set( 'posts_per_page', 4 );
}
add_action( 'pre_get_posts', 'wpa62751_pre_get_posts' );
2
Milo

注 - 推奨される方法は@Miloによって指摘されています、pre_get_postの使用は常にquery_postsより良い選択です。

ただし、pagedパラメータを渡すことで、ページ付けを有効にすることができます。

例 -

global $wp_query;
$args = array_merge( 
                $wp_query->query, // old query
                array( 
                    'posts_per_page' => 4,
                    'paged' => get_query_var('paged')
                    //  'paged' => get_query_var('page')
                ) 
        );  
query_posts( $args );
1
amit