Ich erstelle front-page.php
. Diese Seite zeigt die neuesten Beiträge an und bietet auch eine Paginierungsoption, um zu den vorherigen Beiträgen zu gelangen.
Ich habe den Code für die Titelseite wie folgt geschrieben
$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())
Wenn ich zur Startseite der Site gehe (z. B. zur Seite mysite.dev
), wird die Seite ordnungsgemäß angezeigt.
Wenn ich nun auf den Link Next
klicke, wird die URL zu mysite.dev/page/2
. Die Seite 404
wird jedoch anstelle der zweiten Seite von front-page.php
zurückgegeben.
Ich habe ungefähr 5 oder 6 Stunden verbracht. Lesen Sie fast einen Artikel zu diesem Thema und immer noch ratlos.
In Ihren Kommentaren wird front-page.php
nur verwendet, wenn eine Seite als statische Startseite festgelegt ist. Normale Startseiten, dh wenn Titelseiten werden angezeigt auf Ihre letzten Beiträge gesetzt ist, wird index.php
verwendet.
Alle Archivseiten und die Startseite verwenden paged
und nicht page
, daher müssten Sie get_query_var( 'page' )
auf get_query_var( 'paged' )
setzen.
Auf keinen Fall sollten Sie eine benutzerdefinierte Abfrage auf Ihrer Homepage verwenden. Sie sollten pre_get_posts
verwenden, um die Hauptabfrage an Ihre Anforderungen anzupassen
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 );
}
});
Ihre Paginierungslinks sollten dann sein
next_posts_link( 'Next' );
previous_posts_link( 'Previous' );
Ihre Schleife in index.php
sollte so aussehen
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
// Your markup and template tags
}
}
Wenn Sie front-page.php
wirklich als normale Startseite und nicht als statische Startseite verwenden müssen, müssen Sie Folgendes tun
Ändern Sie Ihre Schleife zu dem, was ich oben mit den Paginierungslinks vorgeschlagen habe
Verwenden Sie pre_get_posts
wie oben vorgeschlagen, um die Hauptabfrage nach Ihren Wünschen zu ändern
Verwenden Sie den Filter home_template
, um front-page.php
als Homepage-Vorlage zu verwenden
Sie können Folgendes versuchen
add_filter( 'home_template', function ( $template )
{
$locate_template = locate_template( 'front-page.php' );
if ( !$locate_template )
return $template;
return $locate_template;
});
Die Funktionen next_posts_link()
und previous_posts_link()
funktionieren nicht für statische Titelseiten. Das Problem ist, dass die Paginierung get_query_var( 'paged' )
verwendet, die im globalen $paged
gespeichert ist. Da statische Titelseiten get_query_var( 'page' )
und nicht get_query_var( 'paged' )
verwenden, werden Ihre Links niemals über Seite 1 hinaus paginieren.
Wir können next_posts_link()
und previous_posts_link()
täuschen, dass sie auf einer Archivseite verwendet werden, indem wir den $paged
global auf get_query_var( 'page' )
setzen.
Sie können Folgendes versuchen
$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())
Sie können auch die folgenden Funktionen auf Ihrer statischen Startseite verwenden
$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();
wo die Klasse PreGetPostsForPages
von meine Antwort hier unterstützt wird
add_action( 'pregetgostsforgages_after_loop_pagination', function ()
{
$paged = get_query_var( 'page', 1 );
next_posts_link( 'Next' );
previous_posts_link( 'Previous' );
});