it-swarm.com.de

Die Paginierung gibt 404 nach Seite 20 zurück

Ich habe eine Seitenschleife, die 4 Posts pro Seite vom benutzerdefinierten Post-Typ einliest. Es funktioniert großartig, mit dem einzigen Nachteil, dass die Paginierung nicht über den page/20 hinausgeht, sondern nur 404, und der posts_nav_link zeigt den nächsten Pfeil überhaupt nicht an. Wie die Seiten sind einfach nicht da.

Insgesamt gibt es 119 veröffentlichte Beiträge im benutzerdefinierten Beitragstyp. Wenn ich posts_per_page auf, sagen wir 6, ändere, erhalte ich am Ende Zugriff auf mehr Beiträge, aber es endet auch beim page/20.

Auf der Produktionsseite hört die Paginierung bei 21 auf, da die Live-Datenbank wahrscheinlich mehr Einträge enthält.

Ich habe die Einstellung "Blog-Seiten zeigen höchstens" auf 6 gesetzt.

Hier ist die Schleife, die ich benutze:

<?php
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args  = array(
    'posts_per_page' => 4,
    'orderby'        => 'modified',
    'post_type'      => "projekte",
    'paged'          => $paged
);
$custom_query = new WP_Query($args);
$c = 0;
while($custom_query->have_posts()) :
    $custom_query->the_post();
    ?>
    <article>...</article>
    <?php
endwhile;
wp_reset_postdata(); // reset the query
?>

Ich habe den functions.php millionenfach durchgesehen und nach einem einschränkenden get_pre_posts-Filter gesucht, aber es gibt nichts, was ich sehen kann.

Ich habe auch ein Fehlerprotokoll eingerichtet und nichts wird dort zurückgegeben. Ich habe getestet, dass es funktioniert.

Irgendwelche Vorschläge?

4
any_h

Was Sie erleben, ist ganz normal und erwartet. Dies ist einer der Hauptgründe, warum ich immer auf diesen Punkt eingehe und keine benutzerdefinierten Abfragen verwende, um die Hauptabfrage auf der Homepage oder auf Archivseiten jeglicher Art zu ersetzen. Sie lösen ein Problem, schaffen aber viele andere neue

Schauen wir uns an, was Sie haben und warum Sie diese Ergebnisse erhalten:

GRUNDLAGEN

Obwohl die Ausgabe auf Ihrer Archivseite nicht angezeigt wird, wird die Hauptabfrage beim Laden von every Seiten ausgeführt und gibt unabhängig davon eine Reihe von Beiträgen zurück. Durch das Entfernen der Schleife wird die Ausführung der Hauptabfrage nicht gestoppt. Die Schleife zeigt nur an, was von der Hauptabfrage abgerufen wird. Wenn Sie also die Standardschleife durch eine benutzerdefinierte Schleife ersetzen, rufen Sie im Grunde genommen zwei Sätze von Posts pro Seitenladevorgang ab. Die von der Hauptabfrage abgerufenen Posts und die von der benutzerdefinierten Abfrage abgerufenen Posts. Wenn Sie dies testen möchten, fügen Sie die folgende Codezeile außerhalb der Schleife auf Ihrer Archivseite in PHP-Tags ein

?><pre><?php var_dump( $wp_query->posts ); ?></pre><?php

Dadurch wird das Array der Beiträge ausgegeben, die von der Hauptabfrage auf dieser bestimmten Seite abgerufen wurden

Dies macht benutzerdefinierte Abfragen sehr ineffizient, wenn die Hauptabfrage ersetzt wird. Es ist wie das Ersetzen eines aufgepumpten Reifens in Topform durch einen durchbohrten, abgenutzten Reifen.

IHR SZENARIO

Sie haben das folgende Szenario

  • 119 Beiträge von Ihrem benutzerdefinierten Beitragstyp

  • Die in admin festgelegte Option für Beiträge pro Seite ist 6

  • Bei der benutzerdefinierten Abfrage werden 4 Posts pro Seite abgerufen

DIE MATHEMATIK

Ihre Hauptabfrage gibt 20 Seiten zurück, die Sie mit echo $wp_query->max_num_pages; testen können. Die Mathematik ist einfach, Sie haben 119 Beiträge, die Sie auch mit echo $wp_query->found_posts; überprüfen können. Beiträge pro Seite sind in admin auf 6 gesetzt, die Obergrenze von 119/6 = 20

Bei der benutzerdefinierten Abfrage können Sie auf dieselben Informationen wie oben zugreifen, indem Sie $wp_query in $custom_query ändern. Sie werden sehen, dass Sie noch 119 Beiträge haben, aber Sie werden 30 Seiten haben, da die Anzahl der Beiträge pro Seite jetzt auf 4 festgelegt ist. Die Obergrenze für 119/4 = 30

404 AUF SEITE 21

Immer wenn die Hauptabfrage keine Posts anzeigt, wird ein 404 ausgelöst, und dies ist, was Sie sehen. Es gibt genug Beiträge, um 20 Seiten zu füllen, nicht 21 oder mehr. Wenn Sie also zu Seite 21 gehen, ist die Hauptabfrage 404 einfach deshalb so, weil keine weiteren Beiträge mehr angezeigt werden müssen, unabhängig davon, ob Sie in Ihrer benutzerdefinierten Abfrage noch viel anzuzeigen haben.

Ich habe Posts gesehen, in denen Leute sagen, dass die Lösung einfach ist. Ändern Sie einfach die Anzahl der Posts pro Seite auf der Admin-Seite so, dass sie mit der Ihrer benutzerdefinierten Abfrage übereinstimmt. Tu das niemals . Ja, es behebt das Problem, aber es beseitigt das eigentliche Problem, dass Sie die Hauptabfrage nicht durch eine benutzerdefinierte ersetzen sollten. Übrigens ist die eigentliche Lösung des Problems ziemlich einfach, sauber und die richtige Methode, um das zu erreichen, was Sie brauchen

WARUM DIE BENUTZERDEFINIERTE FRAGE

Sie haben sich aus zwei Gründen für eine benutzerdefinierte Abfrage entschieden

  • Die Anzahl der Beiträge pro Seite auf Ihrer Archivseite für benutzerdefinierte Beitragstypen unterscheidet sich vom Rest der Website

  • Lassen Sie die Beiträge nach Datum sortieren und nicht das Standard-Post-Datum ändern

Wie Sie sehen, haben Sie zwei Probleme mit Ihrer benutzerdefinierten Abfrage gelöst, aber andere Probleme verursacht

DIE LÖSUNG

Dies ist die richtige, einfache Methode, um Ihr Problem zu lösen. Verwenden Sie pre_get_posts, um die Hauptabfrage zu ändern, bevor sie ausgeführt wird. pre_get_posts ändert die Abfragevariablen entsprechend, um die SQL-Abfrage für die jeweilige Seitenanforderung zu berechnen.

Sie müssen hier zwei Dinge tun, die erste wäre, Ihre benutzerdefinierte Abfrage auf Ihrer Archivseite zu entfernen und sie durch die Standardschleife zu ersetzen. Sobald Sie dies getan haben, sehen Sie 6 Posts pro Seite, sortiert nach Postdatum, wie es standardmäßig sein sollte.

Öffne jetzt functions.php und pre_get_posts, um die Anzahl der Beiträge pro Seite und die Sortierreihenfolge zu korrigieren

add_action( 'pre_get_posts', function ( $q ) 
{
    if(    !is_admin() 
        && $q->is_main_query() 
        && $q->is_post_type_archive( 'projekte' ) 
    ) {
        $q->set( 'posts_per_page', 4          );
        $q->set( 'orderby',        'modified' );
    }
});

Sie sollten jetzt 4 Beiträge pro Seite sehen, die nach Änderungsdatum sortiert sind und korrekt auf Ihrer Archivseite für benutzerdefinierte Beitragstypen angezeigt werden. projekte

ZUSÄTZLICHES LESEN

Sie sollten auch den folgenden Beitrag lesen, den ich vor einiger Zeit zu einem ähnlichen Thema verfasst habe, sowie alle Beiträge, auf die ich in diesem bestimmten Beitrag verlinkt habe

BEARBEITEN

Für diejenigen, die Dinosaurier-PHP-Versionen verwenden, die keine Closures unterstützen, gibt es hier die Fallback-Version der Aktion pre_get_posts

add_action( 'pre_get_posts', 'wpse176347_pre_get_posts' );
function wpse176347_pre_get_posts( $q ) 
{
    if(    !is_admin() 
        && $q->is_main_query() 
        && $q->is_post_type_archive( 'projekte' ) 
    ) {
        $q->set( 'posts_per_page', 4          );
        $q->set( 'orderby',        'modified' );
    }
}
18
Pieter Goosen