it-swarm.com.de

Warum wird die Paginierung immer ab, wenn sie auf einer Homepage in irgendeiner Form verwendet wird?

Warum wird die Paginierung von WP unterbrochen, wenn sie auf der Startseite verwendet wird?

Wenn Sie den folgenden Code verwenden und in einer Seitenvorlage verwenden, funktioniert er einwandfrei (stellen Sie sicher, dass Sie 3 oder mehr Beiträge haben). Sobald Sie jedoch denselben Code für home.php, front-page.php, index.php oder sogar als Seitenvorlage verwenden, aber als statische Startseite festlegen, wird der Fehler behoben.

Die URL zeigt /page/2/, aber Sie erhalten eine 404-Seite. Wenn Sie die URL in /?page=2 ändern, funktioniert dies.

Ich habe so viele diesbezügliche Fragen gesehen, aber keine hat eine Lösung, die funktioniert.

Der Einfachheit halber habe ich die folgende Schleife vereinfacht und verwende die standardmäßigen WP Links für die nächsten und vorherigen Beiträge. Ich möchte kein Plugin wie WP-PageNavi oder ähnliches verwenden.

<?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

Die Lösung besteht darin, die Hauptabfrage in der Vorlage nicht zu ändern. Die Standardabfrage wird ausgeführt, bevor die Vorlage geladen wird. Bei der Abfrage in der Vorlage wird die ursprüngliche Abfrage überschrieben, was eine Verschwendung von Ressourcen darstellt. Das Beispiel im Codex unter pre_get_posts zeigt, wie die Standardabfrage ohne Paginierungsprobleme korrekt geändert werden kann.

7
Milo

Auch aus codex.wordpress.com/Pagination (Unter "Erweiterte Schritte zur Fehlerbehebung"> "Entfernen von query_posts aus der Hauptschleife") in Bezug auf Änderungen die Hauptabfrage über die von Milo erwähnte Aktion pre_get_posts:

[...] fügen Sie die Abfrage für Ihre Startseiten und Kategorieseiten wieder in die Datei functions.php Ihres Themas ein:

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

Ihre Implementierung könnte also in etwa so aussehen wie

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