私はfront-page.php
を作成しています。このページには最新の特集記事が表示され、前の注目記事に移動するためのページ付けオプションもあります。
以下のようにフロントページのコードを書きました。
$args = array();
$args['post_type'] = 'post';
$args['post_status'] = 'publish';
$args['category_name'] = 'featured';
$args['posts_per_page'] = 4
$args['paged'] = (get_query_var('page')) ? get_query_var('page') : 1;
$the_query = new WP_Query($args);
if ($the_query->have_posts()) {
while ($the_query->have_posts()) {
$the_query->the_post() ;
the_title();
} // End of: while ($the_query->have_posts())
next_posts_link('Next', $the_query->max_num_pages );
previous_posts_link('Previous');
} // End of: if ($the_query->have_posts())
そのため、サイトのフロントページ(mysite.dev
ページなど)に移動すると、ページは正しく表示されます。
さて、Next
リンクをクリックすると、URLはmysite.dev/page/2
になりますが、404
の2ページ目の代わりにfront-page.php
ページが返されます。
私は約5〜6時間を過ごしました。この問題についてはほぼ一件の記事を読んでください。
あなたのコメントから、front-page.php
はページが静的フロントページとして設定されている場合にのみ使用されます。通常のホームページ、つまりフロントページにがに設定されている場合、最新の投稿、index.php
が使用されます。
すべてのアーカイブページとフロントページはpaged
ではなくpage
を使用するので、get_query_var( 'page' )
をget_query_var( 'paged' )
に設定する必要があります。
いずれにせよ、あなたはあなたのホームページでカスタムクエリを使うべきではありません、あなたはあなたのニーズに主なクエリを変えるためにpre_get_posts
を使うべきです
add_action( 'pre_get_posts', function ( $q )
{
if ( $q->is_home()
&& $q->is_main_query()
) {
$q->set( 'category_name', 'featured' );
$q->set( 'posts_per_page', 4 );
}
});
ページネーションのリンクは
next_posts_link( 'Next' );
previous_posts_link( 'Previous' );
index.php
内のループはこのようになります。
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your markup and template tags
}
}
もしあなたが本当にfront-page.php
を静的なフロントページではなく通常のホームページとして使う必要があるなら、あなたは以下をする必要があります。
ページ付けリンクを使用して、ループを上記で提案したものに変更します。
上記のようにpre_get_posts
を使用して、必要に応じてメインクエリを変更します。
ホームページテンプレートとしてhome_template
を使用するには、front-page.php
フィルタを使用します
あなたは以下を試すことができます
add_filter( 'home_template', function ( $template )
{
$locate_template = locate_template( 'front-page.php' );
if ( !$locate_template )
return $template;
return $locate_template;
});
関数next_posts_link()
とprevious_posts_link()
は、箱から出してすぐの静的フロントページでは動作しません。問題は、ページネーションは$paged
グローバルに保存されているget_query_var( 'paged' )
を使用することです。静的フロントページはget_query_var( 'page' )
ではなくget_query_var( 'paged' )
を使用しているので、あなたのリンクは過去のページ1を決してページ付けしません。
グローバルな$paged
をnext_posts_link()
に設定することで、アーカイブページでそれらが使われていると考えるためにprevious_posts_link()
とget_query_var( 'page' )
をだますことができます。
あなたは以下を試すことができます
$paged = get_query_var( 'page', 1 );
$args = [];
$args['post_type'] = 'post';
$args['post_status'] = 'publish';
$args['category_name'] = 'featured';
$args['posts_per_page'] = 4;
$args['paged'] = $paged;
$the_query = new WP_Query($args);
if ($the_query->have_posts()) {
while ($the_query->have_posts()) {
$the_query->the_post() ;
the_title();
} // End of: while ($the_query->have_posts())
next_posts_link('Next', $the_query->max_num_pages );
previous_posts_link('Previous');
wp_reset_postdata(); // VERY VERY IMPORTANT
} // End of: if ($the_query->have_posts())
あなたはまたあなたの静的フロントページで以下を利用することができます。
$query = new PreGetPostsForPages(
251, // Page ID we will target, your static front page ID
'content', //Template part which will be used to display posts, name should be without .php extension
false, // Should get_template_part support post formats
true, // Should the page object be excluded from the loop
[ // Array of valid arguments that will be passed to WP_Query/pre_get_posts
'post_type' => 'post',
'category_name' => 'featured',
'posts_per_page' => 4
]
);
$query->init();
PreGetPostsForPages
クラスは/でサポートされています ここに私の答え
add_action( 'pregetgostsforgages_after_loop_pagination', function ()
{
$paged = get_query_var( 'page', 1 );
next_posts_link( 'Next' );
previous_posts_link( 'Previous' );
});