it-swarm.com.de

Paginierung verursacht Fehler 404, wenn sie mit front-page.php verwendet wird

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.

1
Greeso

BEARBEITEN

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;
});

URSPRÜNGLICHE ANTWORT

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())

BEARBEITEN

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' );
});
4
Pieter Goosen