it-swarm.com.de

Sollen wir den Postglobalen vertrauen?

@toscho hat einen Kommentar zu dieser Antwort abgegeben, über den ich noch einmal nachgedacht habe. Wie viel Vertrauen sollten wir in den globalen Geltungsbereich haben, insbesondere in Bezug auf 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 sicherlich einer der Globals, der meistens entweder innerhalb des Themas selbst oder durch Plugins modifiziert wird. Es ist jedoch auch das in anderen Anwendungen innerhalb einer bestimmten Vorlage am häufigsten verwendete globale Verfahren, um beispielsweise verwandte Posts einzurichten.

Durch das Beantworten (und Kommentieren) mehrerer Posts mit bestimmten Problemen verursacht durch die Verwendung von benutzerdefinierten Abfragen wird deutlich, dass die meisten Probleme dadurch verursacht werden, dass benutzerdefinierte Abfragen nicht zurückgesetzt werden (benutzerdefinierte Abfragen ändern die von festgelegten globalen Werte) die Hauptabfrage).

Daraus ergibt sich, dass $post nicht zuverlässig ist. Jeder schlecht geschriebene Code, der eine benutzerdefinierte Abfrage verwendet, kann den $post global ä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 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 Site veröffentlicht?

Meine Frage: Wie können Sie sich vor solchen Problemen schützen, die durch anderen importierten Code verursacht werden, wenn ein globaler Code wie $post so unzuverlässig ist? Sollten wir überhaupt einen globalen Code wie $post verwenden? Was sind die Alternativen?

Bevor ich zum Schluss komme, möchte ich hier kurz meine Meinung mitteilen: Ich habe mir überlegt (und in einigen Themen und Plugins auch darüber nachgedacht), ob ich wp_reset_postdata() oder wp_reset_query() verwende, bevor ich $post verwende, um sicherzustellen, dass der globale Code auf den $post der Hauptabfrage zurückgesetzt wird. . 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, an die ich gedacht habe, ist, den $wp_query zu verwenden und dann seine Methoden zu verwenden, so etwas wie $wp_query->post.

Alle Gedanken dazu werden geschätzt.

21
Pieter Goosen

Es gibt eine traurige Wahrheit: Sie können niemals sicher sein, dass einige Codes nicht kaputt gehen Ihr Code, und es gibt nichts was Sie tun können, um dies zu verhindern. Besonders in WordPress, wo alles global ist.

Das heißt, ja, globaler $post ist eine der am häufigsten verwendeten globalen Variablen, daher kann die Verwendung spezieller care for iteine gute Idee sein.

In meinem Code greife ich selten direkt auf den globalen $post zu.

In singular contest verwende ich get_queried_object() und überprüfe normalerweise, ob $post eine gültige WP_Post-Instanz ist:

$post = get_queried_object();

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

Ich überprüfe dies auch in den seltenen Fällen, in denen ich direkt auf $post zugreife.

Bedenken Sie, dass get_queried_object() einen unerwarteten Wert zurückgibt, wenn ein Code query_posts verwendet, aber hey, wenn jemand Code verwendet, der auf query_posts basiert, hat er es verdient, wenn seine Site kaputt geht :)

Wenn ich darüber hinaus einige Bedingungen erwarte, überprüfe ich sie, z. bestimmte Beitragstypen oder einen bestimmten Status.

Wenn ich mehr Prüfungen und an mehr Stellen benötige, erstelle ich eine Funktion, um diese 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 Sie in einer benutzerdefinierten Abfrage während der Schleife the_post() aufrufen, wird das Post-Objekt zurückgesetzt, sodass es in Ordnung sein sollte. Dann ist es meine Aufgabe, nach einer benutzerdefinierten Abfrage wp_reset_postdata() anzurufen, und das mache ich natürlich :)

16
gmazzap