@toscho dejó un comentario a esta respuesta que me hizo pensar de nuevo. ¿Cuánta confianza deberíamos tener en el ámbito global, especialmente con respecto a las publicaciones globales $post
?
¿Y qué? Todos pueden sobrescribir la variable global antes de que se ejecute su cheque. Ese es el punto de las variables globales: acceso global.
$post
por ejemplo, seguramente es uno de los globales que se modifica principalmente dentro del tema o por complementos. Sin embargo, también es el más utilizado globalmente en otras aplicaciones dentro de una plantilla determinada, por ejemplo, para configurar publicaciones relacionadas.
Al responder (y comentar) varias publicaciones con problemas específicos causados por el uso de consultas personalizadas , realmente se destaca que la mayoría de los problemas se deben a que las consultas personalizadas no se restablecen (las consultas personalizadas alteran los globales establecidos por la consulta principal).
A partir de esto, es evidente que $post
no es confiable. Cualquier código mal escrito que haga uso de una consulta personalizada puede alterar el $post
global, lo que a su vez romperá algo (como publicaciones relacionadas).
Solo un puñado de desarrolladores de WordPress están realmente bien informados sobre el funcionamiento interno de core y saben qué evitar y qué no. La mayor población de usuarios no tiene idea de cómo funciona el núcleo de WordPress.
Simplemente descargan un tema e instalan complementos para hacer lo que se necesita o incluso simplemente copian el código de un tutorial. Digamos que instalan un complemento mal escrito que rompe sus publicaciones relacionadas en su única publicación, ¿cómo sabrán qué causó eso? ¿Serán capaces de resolverlo ellos mismos o serán la centésima persona escribiendo un correo electrónico al autor del tema sobre este problema o publicando una pregunta en este sitio?
Mi pregunta: ¿cómo puede protegerse contra los problemas causados por otro código importado cuando un elemento global no $post
es tan confiable? ¿Deberíamos utilizar un global como $post
en absoluto? Cuales son las alternativas?
Solo para compartir mi mente aquí antes de concluir: he pensado (y también he visto en algunos temas y complementos) usar wp_reset_postdata()
o wp_reset_query()
antes de usar $post
, para asegurarme de que el global se restablezca a la consulta principal $post
. Pero, ¿por qué debería inflar mi código en mi tema porque alguien más no codificó correctamente su complemento? Y si alguien restableció correctamente su consulta personalizada, esta operación se ejecuta una segunda vez innecesaria, lo que no es bueno.
El segundo método en el que pensé es hacer uso de $wp_query
y luego usar sus métodos, algo así $wp_query->post
.
Cualquier idea sobre esto será apreciada.
Respuestas:
Hay una triste verdad: nunca se puede estar seguro de que alguna vez algún código no va a romper su código, y no hay nada que puede hacer para evitarlo. Especialmente en WordPress, donde todo es global.
Dicho esto, sí, global
$post
es una de las var global más utilizado, por lo que el uso de especial atención por ello puede ser una buena idea.En mi código rara vez accedo directamente a global
$post
.Cuando estoy en un concurso singular , uso
get_queried_object()
y generalmente verifico si$post
es unaWP_Post
instancia válida :Hago esa comprobación también en los raros casos a los que accedo
$post
directamente.Tenga en cuenta que
get_queried_object()
devuelve un valor inesperado si se usa algún códigoquery_posts
, pero bueno, si alguien usa un código en el que se basaquery_posts
, se lo merece si su sitio se rompe :)Además, si espero algunas condiciones, las verifico, por ejemplo, tipos de publicaciones específicas o un estado específico.
Si necesito más controles y en más lugares, creo una función para realizarlos:
Cuando está dentro de una consulta personalizada, mientras se repite, la llamada
the_post()
restablece el objeto de publicación, por lo que debería estar bien. Entonces es mi responsabilidad llamarwp_reset_postdata()
después de una consulta personalizada, y lo hago, por supuesto :)fuente