web-dev-qa-db-ja.com

何かの形式のホームページでページネーションを使用すると、常に改ページが壊れるのはなぜですか?

ホームページでWPページ付けを使用すると、改ページが壊れるのはなぜですか。

あなたが以下のコードを取り、それをページテンプレートで使用するならば、それは完全に機能します(あなたが3つ以上の投稿を持っていることを確認してください)。ただし、home.php、front-page.php、index.php、またはページテンプレートとして同じコードを使用しても静的ホームページとして設定すると、すぐに壊れます。

URLに/page/2/が表示されますが、404ページになります。 URLを/?page=2に変更してもうまくいきます。

私はあちこちでこれに関連して非常に多くの質問を見ました、しかしどれもうまくいく解決策を持っていません。

簡単にするために、以下のループを単純化し、デフォルトのWP nextおよびprevious postsリンクを使用します。 WP-PageNaviなどのプラグインは使いたくありません。

<?php get_header(); ?>

    <?php

        // taken from https://codex.wordpress.org/Pagination
        if ( get_query_var('paged') ) { 
            $paged = get_query_var('paged'); 
        } 
        else if ( get_query_var('page') ) {
            $paged = get_query_var('page'); 
        } 
        else {
            $paged = 1;
        }

        $wp_query = new WP_Query( array( 
            'posts_per_page' => 2,
            'paged' => $paged
        ));

    ?>

    <?php if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post(); ?>

         <?php the_title(); ?>

    <?php endwhile; endif; ?>

    <?php previous_posts_link(); ?>
    <?php next_posts_link(); ?>

    <?php wp_reset_query(); ?>

<?php get_footer(); ?>
3
Andrew

解決策は、テンプレート内のメインクエリを変更しないことです。デフォルトのクエリはテンプレートが読み込まれる前に行われるため、テンプレートでクエリを実行すると元のクエリが上書きされます。これはリソースの無駄遣いです。ページ区切りの問題なしにデフォルトのクエリを変更する正しい方法については、 pre_get_posts のcodexの例を参照してください。

7
Milo

codex.wordpress.com/Pagination (「高度なトラブルシューティング手順」>「メインループからquery_postsを削除 ")Miloが言及したpre_get_postsアクションを介したメインクエリの変更に関して:

[...] ホームページとカテゴリページのクエリをテーマのfunctions.phpファイルに追加します。

function my_post_queries( $query ) {
     // do not alter the query on wp-admin pages and only alter it if it's the main query
    if (!is_admin() && $query->is_main_query()){
        // alter the query for the home and category pages 

        if(is_home()){
           $query->set('posts_per_page', 3);
        }

        if(is_category()){
            $query->set('posts_per_page', 3);
        }
    }
}
add_action( 'pre_get_posts', 'my_post_queries' );

したがって、実装は次のように見えるかもしれません

function modify_query( $query ) {
    if( !$query->is_main_query() )
        return;  //Only wish to modify the main query

    //Modify the query vars for the home and front pages
    if( is_home() || is_front_page() ) {
        $paged = get_query_var('page');

        //If the 'page' query var isn't set, or didn't return an integer, default to 1
        $paged = !isset( $paged ) || !is_int( $paged ) ? $paged : 1;

        $query->set( 'paged', $paged );
        $query->set( 'posts_per_page', 2 );
    }
}
add_action( 'pre_get_posts', 'modify_query' );        
2
bosco