Sollen wir den Postglobalen vertrauen?

21

@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.

$postZum 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 $postnicht zuverlässig ist. Jeder schlecht geschriebene Code, der eine benutzerdefinierte Abfrage verwendet, kann den $postglobalen 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 $postso 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_queryMethoden von und zu verwenden, so etwas wie $wp_query->post.

Alle Gedanken dazu werden geschätzt.

Pieter Goosen
quelle
Durch das Zurücksetzen des Posts wird nur eine Variable in eine andere kopiert. Sie können dies in Ihrem Code millionenfach aufrufen und sehen, dass die Leistung nicht beeinträchtigt wird. Ich weiß also nicht, was daran nicht gut ist.
Milo

Antworten:

16

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 $postist 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 $postes sich um eine gültige WP_PostInstanz handelt:

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

Ich überprüfe das auch in den seltenen Fällen, auf die ich $postdirekt zugreife .

Bedenken Sie, dass get_queried_object()ein unerwarteter Wert zurückgegeben wird, wenn ein Code verwendet wird query_posts, aber hey, wenn jemand Code verwendet, der sich darauf stützt query_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:

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

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 :)

gmazzap
quelle