Der wichtigste Punkt zuerst!
WordPress macht immer eine Main-Query! Auch auf virtuellen Endpunkten wird ein Post geholt!
Die URL selbst wird meist in Parameter für die wp_query übersetzt. Daher gibt es quasi immer eine Main-Query.
Hier am Beispiel eines virtuellen Endpunktes.
Virtuell heißt, dass eigentlich kein Post dahinter liegt, wir aber mit den Rewrites Parameter übergeben.
Das Post-Objekt
Im WordPress-Universum ist das Post-Objekt der zentrale Angelpunkt.
Die zentralen Inhalte sind, aus der Sicht eines WordPress-Entwicklers, immer Post-Objekte.
Wir erstellen im Backend einen Post oder eine Seite. Zack, im Hintergrund wird ein Post-Objekt verarbeitet.
Rufen wir im Frontend einen Beitrag ab, zack wird ein Post-Objekt verarbeitet, mit dem man als Entwickler standardisiert arbeiten kann.
Post-Objekte bekommen eine eindeutige ID, mit der wir immer direkt auf diesen Eintrag referenzieren können.
Es ist egal, ob wir uns innerhalb des Loops befinden, oder ohne Loop direkt auf einer einzelnen Seite. Es gibt immer ein Post-Objekt.
Immer!
Wir können uns im Code immer die Daten für den aktuellen Post von WordPress ausgeben lassen und wissen somit immer, wo wir genau sind.
Daneben haben wir auch die Möglichkeit, überall im Code auf einen bestimmten Post zuzugreifen. Solange wir die Post-ID kennen, wissen wir sozusagen alles über den Post selbst. Aber was ist mit virtuellen Endpunkten, denen keine ID zugewiesen ist und die auch keinen Datenbank-Eintrag haben?
Post-Objekt, auch ohne Post?!
Die Funktionalität der WordPress-Posts ist dabei so aufgebaut, dass wir auch auf virtuellen Endpunkten ein Post-Objekt zurückbekommen können!
Das heißt, wenn wir uns auf einer Seite befinden, die weder im Backend, noch in der Datenbank existiert, kann es trotzdem vorkommen, dass wir von WordPress ein Post-Objekt zugewiesen bekommen.
Als Beispiel betrachten wir die Seite mit den Suchergebnissen. Ich habe hierfür das Template für die Suchergebnisse mit zusätzlichen Debug-Ausgaben versehen. Wie wir erkennen können, erhalten wir auch außerhalb des Loops die selben Werte, wie vom ersten Suchergebnis.
Das kommt daher, weil es das erste Post-Objekt ist, das wir von WordPress bekommen. Es gibt immer eine Abfrage nach einem Post, daher gibt es auch bei jeder Seite ein Post-Objekt.
Und wie kommt das jetzt zustande?
So gut wie alle Funktionen, die intern mit den Posts zu tun haben, greifen auf die Funktion `get_post()` zurück.
Und diese Funktion greift wiederum auf die globale Variable `post` zurück, wenn wir keine ID oder ein Post-Objekt übergeben.
Sobald wir also die Suche anschmeißen, wird die globale Variable erstellt und bereits mit dem ersten Treffer befüllt. Daher bekommen wir außerhalb des Loops bereits die Daten für das erste Suchergebnis.
Es gibt immer ein Post-Objekt
WordPress befüllt so gut wie immer die globale Post-Variable
Das kann zeitweise auch zu einem Verhalten führen, dass man so nicht erwartet hat. Wird kein Post-Objekt an Funktionen als Parameter übergeben, so greift WordPress auf das globale Post-Objekt zurück!
Sieht man schön in diversen Code-Stellen:
Daher auch immer aufpassen, wie man Funktionen aufruft, weil da eventuell ein ganz anderer Post verarbeitet wird, als man vermutet!
Conclusio
Solltet ihr euch in Zukunft wundern, warum ihr unerwartete Werte beim Verwenden solcher Funktionen zurückbekommt, denkt daran, dass wir meistens irgendwo ein Post-Objekt haben.
Dieses Verhalten können wir neben den Suchergebnissen übrigens auch bei den Archiven der Beiträge oder bei Custom Post Types beobachten.