Dovremmo fidarci dei post globali?


21

@toscho ha lasciato un commento a questa risposta che mi ha fatto riflettere di nuovo. Quanta fiducia dovremmo avere nell'ambito globale, specialmente per quanto riguarda i post globali $post?

E allora? La variabile globale può essere sovrascritta da tutti prima dell'esecuzione del controllo. Questo è il punto delle variabili globali: accesso globale.

$postper esempio è sicuramente uno dei globi che viene per lo più modificato o all'interno del tema stesso o dai plugin. Tuttavia, è anche il più usato a livello globale in altre applicazioni all'interno di un determinato modello, ad esempio per configurare post correlati.

Dal rispondere (e commentare) diversi post con problemi specifici causati dall'uso di query personalizzate , si nota che la maggior parte dei problemi è causata dal fatto che le query personalizzate non vengono ripristinate (le query personalizzate alterano i globi impostati dalla query principale).

Da ciò, è evidente che $postnon è affidabile. Qualsiasi pezzo di codice scritto male che utilizza una query personalizzata può alterare il $postglobale, che a sua volta romperà qualcosa (come i post correlati).

Solo una manciata di sviluppatori di WordPress è in realtà abbastanza ben informato sul funzionamento interno del core e sa cosa evitare e cosa no. La maggior parte degli utenti non ha idea di come funzioni il core di WordPress.

Semplicemente scaricano un tema e installano i plugin per fare ciò che è necessario o anche semplicemente copiare il codice da un tutorial. Supponiamo che installino un plug-in mal scritto che interrompe i loro post correlati sul loro singolo post, come potranno sapere cosa l'ha causato? Saranno in grado di risolverli da soli o saranno la centesima persona a scrivere un'e-mail all'autore del tema su questo problema o a pubblicare una domanda su questo sito?

La mia domanda: come è possibile proteggersi da tali problemi causati da altri codici importati quando un like globale $postè così inaffidabile? Dovremmo usare un global come $posttutti? Quali sono le alternative?

Solo per condividere la mia mente qui prima di concludere: ho pensato (e visto anche in alcuni temi e plugin) di utilizzare wp_reset_postdata()o wp_reset_query()prima di fare uso $post, per assicurarmi che il globale sia ripristinato alla query principale $post. Ma perché dovrei gonfiare il mio codice nel mio tema perché qualcun altro non ha codificato correttamente il suo plugin? E se qualcuno ha reimpostato correttamente la propria query personalizzata, questa operazione viene eseguita una seconda volta non necessaria, il che non va bene.

Il secondo metodo a cui ho pensato è usare $wp_querye quindi usare i suoi metodi, qualcosa del genere $wp_query->post.

Qualsiasi pensiero su questo sarà apprezzato.


Il ripristino del post copia solo una var a un'altra, potresti chiamarla un milione di volte nel tuo codice e non vedere alcun hit di performance, quindi non so cosa non va bene.
Milo,

Risposte:


16

C'è una triste verità: non puoi mai essere sicuro che un po 'di codice non romperà il tuo codice, e non c'è niente che puoi fare per impedirlo. Soprattutto in WordPress, dove tutto è globale.

Detto questo, sì, il globale $postè uno dei var globali più utilizzati, quindi usare una cura speciale per questo può essere una buona idea.

Nel mio codice raramente accedo direttamente a livello globale $post.

Quando sono in contest singolare , uso get_queried_object()e di solito controllo se $postè WP_Postun'istanza valida :

$post = get_queried_object();

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

Lo controllo anche nei rari casi a cui accedo $postdirettamente.

Considera che get_queried_object()restituisce un valore imprevisto se viene utilizzato un codice query_posts, ma hey, se qualcuno utilizza il codice su cui si basa query_posts, se lo merita se il loro sito si rompe :)

Inoltre, se mi aspetto alcune condizioni, le controllo, ad esempio tipi di posta specifici o uno stato specifico.

Se ho bisogno di più controlli e in più punti, creo una funzione per eseguirli:

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?!' );
}

Quando all'interno di una query personalizzata, durante il ciclo continuo, la chiamata the_post()reimposta l'oggetto post, quindi dovrebbe andare bene. Quindi è mia responsabilità chiamare wp_reset_postdata()dopo una query personalizzata e lo faccio, ovviamente :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.