@toscho hat einen Kommentar zu dieser Antwort hinterlassen , über den ich noch einmal nachgedacht habe. Wie viel Vertrauen sollten wir in die globale Reichweite haben, insbesondere in Bezug auf die Post-Globals wie $post
?
Na und? Die globale Variable kann von jedem Benutzer überschrieben werden, bevor Ihre Prüfung ausgeführt wird. Das ist der Punkt globaler Variablen: globaler Zugriff.
$post
Zum Beispiel ist es sicherlich einer der Globals, der meistens entweder innerhalb des Themas selbst oder durch Plugins modifiziert wird. Es ist jedoch auch das weltweit am häufigsten in anderen Anwendungen innerhalb einer bestimmten Vorlage verwendete Verfahren, um beispielsweise verwandte Posts einzurichten.
Aus der Beantwortung (und Kommentierung) mehrerer Posts mit bestimmten Problemen, die durch die Verwendung benutzerdefinierter Abfragen verursacht wurden , geht hervor, dass die meisten Probleme darauf zurückzuführen sind, dass benutzerdefinierte Abfragen nicht zurückgesetzt werden (benutzerdefinierte Abfragen ändern die von der Hauptabfrage festgelegten globalen Werte).
Daraus ist ersichtlich, dass dies $post
nicht zuverlässig ist. Jeder schlecht geschriebene Code, der eine benutzerdefinierte Abfrage verwendet, kann den $post
globalen Code ändern , was wiederum zu Problemen führt (z. B. bei verwandten Posts).
Nur eine Handvoll von WordPress-Entwicklern kennt sich im Kern gut aus und weiß, was zu vermeiden ist und was nicht. Die größere Anzahl von Benutzern hat keine Ahnung, wie der WordPress-Kern funktioniert.
Sie laden einfach nur ein Thema herunter und installieren Plugins, um das zu tun, was benötigt wird, oder kopieren einfach den Code aus einem Tutorial. Angenommen, sie installieren ein schlecht geschriebenes Plugin, das ihre verwandten Posts auf ihren einzelnen Posts bricht. Woher wissen sie, was das verursacht hat? Werden sie in der Lage sein, das selbst zu klären, oder werden sie die hundertste Person sein, die eine E-Mail an den Autor des Themas über dieses Problem schreibt oder eine Frage auf dieser Website veröffentlicht?
Meine Frage: Wie können Sie sich vor solchen Problemen schützen, die durch anderen importierten Code verursacht werden, wenn ein globales Like $post
so unzuverlässig ist? Sollen wir überhaupt ein globales wie verwenden $post
? Was sind die Alternativen?
Bevor ich zum Schluss komme, möchte ich hier kurz meine Meinung mitteilen: Ich habe darüber nachgedacht (und in einigen Themen und Plugins auch darüber nachgedacht), ob wp_reset_postdata()
oder wp_reset_query()
bevor ich davon Gebrauch mache $post
, um sicherzustellen, dass die globale Abfrage auf die Hauptabfrage zurückgesetzt wird $post
. Aber warum sollte ich meinen Code in meinem Theme aufblasen, weil jemand anderes sein Plugin nicht richtig codiert hat? Und wenn jemand seine benutzerdefinierte Abfrage ordnungsgemäß zurückgesetzt hat, wird dieser Vorgang ein unnötiges zweites Mal ausgeführt, was nicht gut ist.
Die zweite Methode, die ich mir überlegt habe, ist, die $wp_query
Methoden von und zu verwenden, so etwas wie $wp_query->post
.
Alle Gedanken dazu werden geschätzt.
Antworten:
Es gibt eine traurige Wahrheit: Sie können niemals sicher sein, dass ein Code Ihren Code nicht beschädigt , und Sie können nichts tun, um dies zu verhindern. Besonders in WordPress, wo alles global ist.
Das heißt, ja, global
$post
ist eine der am häufigsten verwendeten globalen Variablen. Daher kann es eine gute Idee sein , besondere Sorgfalt walten zu lassen .In meinem Code greife ich selten direkt auf global zu
$post
.Wenn ich im Einzelwettbewerb bin, benutze ich
get_queried_object()
und überprüfe normalerweise, ob$post
es sich um eine gültigeWP_Post
Instanz handelt:Ich überprüfe das auch in den seltenen Fällen, auf die ich
$post
direkt zugreife .Bedenken Sie, dass
get_queried_object()
ein unerwarteter Wert zurückgegeben wird, wenn ein Code verwendet wirdquery_posts
, aber hey, wenn jemand Code verwendet, der sich darauf stütztquery_posts
, hat er es verdient, wenn seine Site kaputt geht :)Außerdem überprüfe ich, wenn ich bestimmte Bedingungen erwarte, diese, z. B. bestimmte Beitragstypen oder einen bestimmten Status.
Wenn ich mehr Prüfungen und an mehr Stellen benötige, erstelle ich eine Funktion, um sie durchzuführen:
Wenn der Aufruf innerhalb einer benutzerdefinierten Abfrage während der Schleife
the_post()
das Post-Objekt zurücksetzt, sollte dies in Ordnung sein. Dann ist es meine Verantwortung,wp_reset_postdata()
nach einer benutzerdefinierten Abfrage anzurufen , und das mache ich natürlich :)quelle