Absichtlich überschreiten Sie max_num_pages in der Hauptabfrage, ohne 404 zu erhalten?

In author.php habe ich zwei Schleifen: die Standard- Hauptschleife , die alle Beiträge von diesem Autor erhält, und eine andere benutzerdefinierte WP_Query namens $secondloop . Bei beiden Abfragen ist posts_per_page auf 3 festgelegt . Jetzt möchte ich beide Abfrageergebnisse paginieren .

Dafür habe ich ein Argument zu $secondloop = new WP_Query($args) hinzugefügt:

 "paged" => (get_query_var('paged')) ? get_query_var('paged') : 1; 

(lese: setze die Seite dieser Abfrage auf dieselbe Seite wie die Hauptanfrage ).

DAS PROBLEM:

  • Wenn die Hauptschleife mir 5 Posts gibt und mein $secondloop mir 2 gibt, dann funktioniert das Aufrufen von Seite 2 kein Problem. Es zeigt mir die verbleibenden 2 Posts aus der Hauptschleife und keine von meinem $secondloop (da es nicht nach innen geht while ($secondloop->have_posts()) ).

  • ABER wenn die Hauptschleife 2 Posts hat und $secondloop 5 hat, dann führt das Aufrufen von Seite 2 zu 404 🙁 Ich möchte natürlich $secondloop 2 verbleibende Posts haben.

Das Ändern von irgendetwas in der Vorlage “author.php” hilft nicht, da anscheinend kein PHP-Code mehr ausgeführt wird, sobald WordPress feststellt, dass max_num_pages aus der Hauptschleife überschritten wurde.

Wie kann ich dieses Verhalten “überschreiben”?


DER CODE:

author.php (nur das nützliche Bit)

  
"musikalbum", "posts_per_page" => 3, "author_name" => get_query_var('author_name'), "paged" => $paged )); if ($secondloop->have_posts()) { ?>
have_posts()) : $secondloop->the_post(); get_template_part( 'parts/loop', 'album-grid' ); endwhile; ?>

Einstellen der posts_per_page für meine Hauptabfrage in meiner functions.php

 function my_post_queries( $query ) { if (!is_admin() && $query->is_main_query()){ if (is_author()){ $query->set('posts_per_page', 3); } else { $query->set('posts_per_page', 9); } } } add_action( 'pre_get_posts', 'my_post_queries' ); 

EDIT: VERSUCH 1

Milo hat mich auf eine Antwort hingewiesen, die vorgeschlagen hat, dies zu meiner functions.php hinzuzufügen:

 function my_404_override() { global $wp_query; if (is_author()) { status_header( 200 ); $wp_query->is_404 = false; } } add_filter('template_redirect', 'my_404_override'); 

Aber es zeigt mir immer noch einen 404 Fehler. Wenn ich die if-Klausel entferne, führt sie mich zur index.php, die nicht das ist, was ich beabsichtigt habe. Also ich brauche die if-Klausel … aber WordPress scheint es noch nicht zu wissen!

Das Einfügen des Codes direkt in die Vorlage funktionierte auch nicht, selbst wenn es nur diese drei Zeilen vor get_header(); :

 global $wp_query; status_header( 200 ); $wp_query->is_404 = false; 

EDIT: VERSUCH 2

Ich habe template_redirect zum Einhaken in pre_get_posts :

 function my_post_queries( $query ) { if (!is_admin() && $query->is_main_query()){ if (is_author()){ $query->set('posts_per_page', 3); // NEW CODE: $paged = (get_query_var('paged')) ? intval(get_query_var('paged')) : 1; global $original_page_request; // saves the original value of $paged because I'm about to alter it! if ($paged > $query->max_num_pages) { $query->set('paged', $query->max_num_pages); $original_page_request = $paged; } else { $query->set('posts_per_page', 9); } } } add_action( 'pre_get_posts', 'my_post_queries' ); 

Die Idee war, manuell für die Hauptabfrage zurückzusetzen, wenn sie max_num_pages überschreitet und die “tatsächliche Seite” im global $original_page_request für meine $secondloop , um ihren paged Parameter auf zu setzen. Leider funktioniert es nicht. Ich war so glücklich, kein 404 mehr zu sehen, aber jetzt stellt es automatisch die Hauptabfrageseite auf 0. Warum 0 ?!

Denn in pre_get_posts wird Code ausgeführt, bevor WordPress seine Posts bekommen hat. Es gibt Zugriff auf $query aber das ist nur für das Setzen von Abfragevariablen, es sind keine Posts retreived, und daher können keine max_num_pages berechnet werden.

Das bedeutet, dass ich keine Ahnung habe, wann ich max_num_pages überschreiten werde.

Ich habe dann den neuen Code von my_post_queries( $query ) in eine andere function kopiert, die sich in wp my_post_queries( $query ) . Dort ist max_num_pages eine gültige Nummer und is_author () ist auch korrekt. Sobald ich die Anzahl der Beiträge überschreite, immer noch kein Glück. 404. Ich könnte $wp_query->is_404 = false aber das bringt mich wieder zum Index zurück.

Solutions Collecting From Web of "Absichtlich überschreiten Sie max_num_pages in der Hauptabfrage, ohne 404 zu erhalten?"

WordPress führt diese functionen bei jeder Seitenladung in der entsprechenden Reihenfolge aus:

 init(); parse_request($query_args); send_headers(); query_posts(); handle_404(); register_globals(); 

wo die Hauptabfrage nach query_posts() . Beachten Sie, dass WordPress zu diesem Zeitpunkt die Vorlage und alle max_num_pages wie max_num_pages .

handle_404() in handle_404() die Hauptabfrage Posts enthält, gibt die function zurück, und WordPress lädt die Vorlage weiter. Andernfalls sendet es einen HTTP-Status 404 und lädt stattdessen die 404-Vorlage.

Seit WordPress 4.5 gibt es einen Filter-Hook namens pre_handle_404 . Wenn es auf ” true , gibt handle_404() zurück (unabhängig davon, ob die Hauptabfrage Posts enthält) und die Vorlage wird weiterhin geladen.

Nach langem Herumspielen funktioniert das endlich. Fügen Sie dies zu Ihrer functions.php hinzu :

 function ignore_404_past_max_page($bool = false, $query) { $paged = (get_query_var('paged')) ? intval(get_query_var('paged')) : 1; if (is_author() && ($paged > $query->max_num_pages)) $bool = true; return $bool; } add_filter( 'pre_handle_404', 'ignore_404_past_max_page', 10, 2); 

Das ist es! Keine Bearbeitung vorhandener functionen, Säuberung und Ausführung genau so, wie Sie es möchten: Verhindern Sie, dass WP 404 wird. Stellen Sie sicher, WordPress auf Version 4.5 (und höher) zu aktualisieren !

Ein unerwünschter Nebeneffekt könnte sein, dass Sie nun bis PHP_INT_MAX paginieren PHP_INT_MAX und leere Seiten erhalten (außer Sie fügen get_the_author_meta() und get_wp_user_avatar() ). Sie könnten sich wahrscheinlich die maximale Seitennummer für jeden Autor in der database merken, sie dann abfragen und mit $paged , um $bool in der obigen function auf false zu setzen. Aber ich bin wirklich glücklich darüber, wie es jetzt funktioniert.