get_queried_object () gibt beim Archiv nach dem Datum null zurück

7

get_queried_object()Gibt die nullPost-Date-Archive (Seitentyp is_date()) und die Haupt-Blog-Indexseite (Seitentyp is_home()) zurück. Ist das beabsichtigt oder nur ein Versehen?

Ich habe einen Wrapper um get_queried_object () geschrieben, um den Titel der aktuellen Seite für die Verwendung in einem Thema zu erhalten, unabhängig davon, um welchen Seitentyp es sich handelt. Mir wurde schnell klar, dass ich anstatt zu verwenden get_query_object()nur die wichtigen Teile von duplizieren sollte wp_title(), aber vorher stieß ich auf ein interessantes Problem.

Es scheint , dass get_queried_object()und seine Wurzelfunktion WP_Query->get_queried_object()Rückkehr nullfür ein paar Typen Auflistung, einschließlich der primäre Beiträge Listenausgabe von index.php (Seitentyp is_home()) und Post - Archiven nach Datum (Seitentyp is_date()).

Ich habe dies getestet, indem ich das folgende Snippet in eine Reihe von Vorlagendateien an verschiedenen Orten geworfen habe, immer nach get_header()und vor the_post():

<pre><code><?php
    $queried_object = get_queried_object();
    var_dump( $queried_object );
?></code></pre>

Dies funktioniert perfekt in Kategoriearchiven, Tag-Archiven, benutzerdefinierten Taxonomiearchiven und benutzerdefinierten Post-Typ-Archiven. get_queried_object()Gibt das Abfrageobjekt zurück, mit dem ein Seitentitel und andere nützliche Informationen extrahiert werden können.

In archive.php für Standardarchive für Post-Datumsangaben und in index.php für die normale Listenansicht der Homepage von Blog-Posts schlägt dies jedoch fehl.

Das Durchsuchen der Quelle vonWP_Query->get_queried_object() zeigt etwas ziemlich Überraschendes: Es gibt keine Überprüfung auf Seitentyp is_home()oder Seitentyp is_date(), daher wird dieser Seitentyp $this->queried_object = null;nicht aktualisiert und die Funktion kehrt zurück null.

Meine Frage ist also, ist diese beabsichtigte Funktionalität (z. B. sollten Sie get_queried_object () auf diesen Seiten nicht verwenden), eine technische Einschränkung (gibt es kein aussagekräftiges Objekt, das auf diesen Seiten zurückgegeben werden kann) oder einfach eine Implementierungsüberwachung?

Gibt es überhaupt ein Äquivalent zum benutzerdefinierten Beitragstypobjekt, das für den integrierten Beitragstyp "Blog-Beitrag" angezeigt werden soll?

Dakota
quelle
2
Toller Punkt +. WordPress könnte etwas tun, um ein Objekt für das Datumsarchiv und die Titelseite kursiv zu erstellen (Hinweis: Es gibt ein Objekt zurück, wenn die Blog-Seite auf eine WordPress-Seite und nicht auf die Startseite eingestellt ist) _italic . Aber am Ende gibt es keine sinnvolle Verwendung von get_queried_object.
Shazzad
1
Ich weiß nicht, wie ich diese Frage wirklich beantworten soll, aber ja, sie get_queried_objectist sehr inkonsistent und gibt mehrere verschiedene Objekte zurück und kehrt manchmal zurück null. Während es nützlich ist, kann es frustrierend sein, es zu verwenden.
s_ha_dum

Antworten:

4

Meine Frage ist also, ist diese beabsichtigte Funktionalität (z. B. sollten Sie get_queried_object () auf diesen Seiten nicht verwenden), eine technische Einschränkung (gibt es kein aussagekräftiges Objekt, das auf diesen Seiten zurückgegeben werden kann) oder einfach eine Implementierungsüberwachung?

Mit get_queried_object () werden der Begriff, der Autor, der einzelne Beitrag, der einzelne benutzerdefinierte Beitragstyp oder das abgefragte Seitenobjekt abgerufen. Ja, das ist beabsichtigt und wofür diese Funktion entwickelt wurde.

Wenn Sie sich in einem Datumsarchiv, einer Startseite oder einer Suche befinden, wird kein einzelnes Objekt abgefragt.

Bearbeiten:

Basierend auf dem ersten Kommentar unten muss das OP das Objekt post_type erhalten. Das Objekt post_type unterscheidet sich vom Objekt queried_object. Wenn Sie das Objekt post_type auf einer Archivseite abrufen müssen, können Sie es von query_vars abrufen.

global $wp_query;

$post_type_object = get_post_type_object( $wp_query->query_vars['post_type'] );
Chris_O
quelle
2
Das ist irritierend; Wenn für benutzerdefinierte Archivseiten vom Typ "Post" (das benutzerdefinierte Objekt vom Typ "Post") eine sinnvolle Rückgabe erforderlich ist, warum sollte für die Standardarchivseiten vom Typ "Post-Post" keine ähnliche Rückgabe erfolgen? Ich nehme an, dass dies wahrscheinlich durch die Geschichte von WP als fokussiertere Blogging-Engine erklärt werden kann, aber gibt es einen guten Grund, warum eingebaute Post-Typen diese Art von Sonderbehandlung erhalten sollten und nicht die Funktionalität erhalten sollten, die sie wie benutzerdefinierte Typen handhaben können ? Ich denke, es wäre nützlicher, wenn benutzerdefinierte Typen leichter mit integrierten Typen gemischt werden könnten.
Dakota
Es gibt andere Möglichkeiten, um das zu bekommen, was Sie wollen. get_queried_object ist NUR anwendbar, wenn die Anfrage eine Kategorie, ein Autor, ein Permalink oder eine Seite ist. Enthält Informationen zur gewünschten Kategorie, zum Autor, zum Beitrag oder zur Seite. Die query_vars enthalten alles andere.
Chris_O
Dann ist meine Verwirrung die Funktionalität von get_queried_object()benutzerdefinierten Archivseiten vom Typ Post, aber nicht von Standard-Archivseiten. Wenn get_queried_object()das Post-Typ-Objekt auf benutzerdefinierten Post-Typ-Archiv- und Indexseiten zurückgegeben wird, ist es meiner Meinung nach nur logisch, das Post-Typ-Objekt auf Standard-Post-Archiv- und Indexseiten zurückzugeben. Ich werde die Situation akzeptieren, wenn es aus historischen Gründen einfach so ist und die spezielle Behandlung der eingebauten Post-Typen der Abwärtskompatibilität dient, aber ich hätte gerne eine Erklärung.
Dakota
Ich denke, es gibt aussagekräftige Informationen, die großartig wären: Welches Jahr / Monat / Tag wird abgefragt, Beiträge zählen / max_num_pages
Thomas Fellinger
Beachten Sie außerdem, dass auf Autorenarchivseiten get_queried_object()ein WP_UserObjekt zurückgegeben wird, während auf termbasierten Archiven ein WP_TermObjekt zurückgegeben wird. Daher muss zuerst die Rückgabe von bereinigt werden get_queried_object(), um sie in einer generischen Archivvorlage zu verwenden. Ein WP_DateObjekt fehlt. da in den Standardthemen achive.php der Datumstitel verwendet wird get_the_date()und dieser get_post()nur das Datum des ersten angezeigten Beitrags darstellt und logischerweise nur funktioniert, aber nicht genau die Abfrage darstellt und darauf basiert, dass alles andere wie erwartet funktioniert.
Thomas Fellinger