Ich bin auf ein seltsames Problem gestoßen.
Angenommen, Sie greifen auf eine zufällige URL zu, die drei oder mehr Ebenen tief ist:
http://example.com/a/b/c
http://example.com/a/b/c/d
...
Dann is_404()
ist true
. So weit, ist es gut. Aber aus irgendeinem Grund werden die letzten Beiträge abgefragt.
$wp_query->request
ist
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1
AND wp_posts.post_type = 'post'
AND (
wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private'
)
ORDER BY wp_posts.post_date DESC
LIMIT 0, 5
Was dann natürlich have_posts()
zurückkehrt true
und so weiter. Kann jemand das erklären?
Was ich bisher herausgefunden habe:
Der Grund, der nur in drei oder mehr Ebenen einsetzt, ist, dass WP zuvor nach Posts und Anhängen sucht, die irgendwie zu einem anderen Verhalten führen.
Es scheint, dass WP, obwohl es die Anfrage an einem Punkt als 404 erkennt, die neuesten Beiträge abruft. Mit Hilfe von @kaiser und @GM habe ich dies von /wp-includes/class-wp.php:608 aufgespürt
Antworten:
Sie werden vielleicht überrascht sein, aber da ist nichts Seltsames.
Lassen Sie uns zunächst klarstellen, dass Sie in WordPress beim Besuch einer Frontend-URL eine Abfrage auslösen. Immer.
Diese Abfrage ist nur ein Standard
WP_Query
, genau wie die, die über Folgendes ausgeführt werden:Es gibt nur einen Unterschied: Die
$args
Variablen werden von WordPress mit derWP::parse_request()
Methode generiert . Diese Methode überprüft lediglich die URL und die Umschreiberegeln und konvertiert die URL in ein Array von Argumenten.Aber was passiert, wenn diese Methode dies nicht kann, weil die URL ungültig ist? Die Abfrage args ist nur ein Array wie folgt:
(Quelle hier und hier ).
Das Array wird also an übergeben
WP_Query
.Versuchen Sie nun Folgendes zu tun:
Sind Sie überrascht, dass die Abfrage genau die in OP ist? Ich bin nicht.
So,
parse_request()
Erstellt ein Array mit einem FehlerschlüsselWP_Query
, das es nur ausführthandle_404()
Das wird nach der Abfrage ausgeführt, betrachtet den'error'
Parameter und setztis_404()
auf trueAlso,
have_post()
undis_404()
sind nicht verwandt. Das Problem ist, dassWP_Query
es kein System gibt, das die Abfrage kurzschließt, wenn etwas schief geht. Wenn das Objekt erstellt wurde, übergeben Sie ihm einige Argumente und die Abfrage wird ausgeführt ...Bearbeiten:
Es gibt zwei Möglichkeiten, um dieses Problem zu lösen:
404.php
Vorlage. WordPress lädt das auf 404 URLs und dort müssen Sie nicht suchenhave_posts()
Erzwinge
$wp_query
, auf 404 leer zu sein, so etwas wie:quelle
$wp->matched_rule
), aber die Abfrage durchläuft die Bewegungen immer noch, da sie dies nicht beachtet.WHERE 1=0
in SQL festgelegt, da die Abfrage nicht gestoppt werden kann. Erzwingen Sie daher eine Abfrage, die nichts zurückgibt ... @Rarstis_404()
Überprüfung durchführen.