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