Devemos confiar nos posts globais?

@toscho deixou um comentário para esta resposta, que me fez pensar de novo. Quanta confiança devemos ter no escopo global, especialmente no que se refere aos pós-globais, como $post ?

E daí? A variável global pode ser substituída de todos antes que sua verificação seja executada. Esse é o ponto das variables ​​globais: access global.

$post por exemplo, é certamente um dos globals que é principalmente modificado quer no próprio tema quer por plugins. No entanto, também é o global mais comumente usado em outras aplicações dentro de um determinado modelo, por exemplo, para configurar postagens relacionadas.

De responder (e comentar) várias postagens com problemas específicos causados ​​pelo uso de consultas personalizadas , realmente se destaca que a maioria dos problemas são causados ​​devido a consultas personalizadas não sendo reiniciadas (consultas personalizadas alteram os globais definidos pela consulta principal).

Deste modo, é evidente que $post não é confiável. Qualquer pedaço de código pouco escrito que faça uso de uma consulta personalizada pode alterar o $post global, que por sua vez irá quebrar algo (como posts relacionados).

Apenas um punhado de desenvolvedores do WordPress são realmente suficientemente conhecedores no funcionamento interno do núcleo e sabem o que evitar e o que não. A maior população de usuários não tem idéia do funcionamento do núcleo do WordPress.

Eles simplesmente simplesmente baixam um tema e instalam plugins para fazer o que é necessário ou até mesmo copiar o código de um tutorial. Diga que eles instalam um plugin mal escrito que quebra seus posts relacionados em sua única publicação, como eles saberão o que causou isso? Eles serão capazes de resolver isso ou serão a centésima pessoa a escrever um e-mail para o autor do tema sobre este problema ou publicar uma pergunta neste site?

Minha pergunta: como você pode proteger contra esses problemas causados ​​por outros códigos importados quando um global como $post é tão pouco confiável? Devemos usar um global como $post ? Quais são as alternativas?

Só para compartilhar minha mente aqui antes de concluir: pensei em (e visto em alguns temas e plugins também) usando wp_reset_postdata() ou wp_reset_query() antes de usar $post , para garantir que o global esteja sendo redefinido para o $post da consulta principal. Mas por que eu deveria inflar meu código no meu tema porque outra pessoa não codificava corretamente seu plugin? E se alguém corrigisse adequadamente sua consulta personalizada, esta operação é executada uma segunda vez desnecessária, o que não é bom.

O segundo método que eu pensei é fazer uso do $wp_query e depois usar seus methods, algo como $wp_query->post .

Qualquer opinião sobre isso será apreciada.

Solutions Collecting From Web of "Devemos confiar nos posts globais?"

Há uma verdade triste: você nunca pode ter certeza de que algum código não quebre seu código, e não há nada que você possa fazer para evitar isso. Especialmente no WordPress, onde tudo é global.

Dito isto, sim, o $post global é uma das variedades globais mais usadas, então, usar cuidados especiais para isso pode ser uma boa idéia.

No meu código, raramente access diretamente ao $post global.

Quando no concurso singular , uso get_queried_object() e geralmente verifico se $post é uma instância WP_Post válida:

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

Eu faço isso também nos casos raros, eu acesse $post diretamente.

Considere que get_queried_object() retorna um valor inesperado se algum código usa query_posts , mas hey, se alguém usa o código que se baseia em query_posts , eles merecem isso se o site quebrar 🙂

Além disso, se eu esperar algumas condições, verifico-as, por exemplo, tipos de postagem específicos ou um status específico.

Se eu precisar de mais cheques e em mais lugares, crio uma function para executá-los:

 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 dentro de uma consulta personalizada, durante o looping, chamar the_post() redefine o object de publicação, então deve estar bem. Então, é minha responsabilidade chamar wp_reset_postdata() após uma consulta personalizada, e eu faço isso, é claro 🙂