¿Deberíamos confiar en los posts globales?

21

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

$postpor 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 $postno es confiable. Cualquier código mal escrito que haga uso de una consulta personalizada puede alterar el $postglobal, 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 $postes tan confiable? ¿Deberíamos utilizar un global como $posten 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_queryy luego usar sus métodos, algo así $wp_query->post.

Cualquier idea sobre esto será apreciada.

Pieter Goosen
fuente
Restablecer la publicación simplemente copia una var a otra, podría llamarlo un millón de veces en su código y no ver un impacto en el rendimiento, por lo que no sé qué no tiene de bueno.
Milo

Respuestas:

16

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 $postes 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 $postes una WP_Postinstancia válida :

$post = get_queried_object();

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

Hago esa comprobación también en los raros casos a los que accedo $postdirectamente.

Tenga en cuenta que get_queried_object()devuelve un valor inesperado si se usa algún código query_posts, pero bueno, si alguien usa un código en el que se basa query_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:

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

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 llamar wp_reset_postdata()después de una consulta personalizada, y lo hago, por supuesto :)

gmazzap
fuente