¿Debemos confiar en los globales de publicación?

20

@toscho ha dejado un comentario en este respuesta que me hizo pensar otra vez. ¿Cuánta confianza deberíamos tener en el ámbito global, especialmente con respecto a las publicaciones globales como $post ?

  

¿Y qué? La variable global se puede sobrescribir de todos antes de que se ejecute su comprobación. Ese es el punto de las variables globales: acceso global.

$post por ejemplo es seguramente una de las globales que se modifica principalmente dentro del tema en sí 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 destaca que la mayoría de los problemas se deben a que las consultas personalizadas no se restablecen (las consultas personalizadas cambian los globales establecidos por la consulta principal).

A partir de esto, es evidente que $post no es confiable. Cualquier fragmento de código mal escrito que haga uso de una consulta personalizada puede alterar el $post global, que a su vez romperá algo (como publicaciones relacionadas).

Solo un puñado de desarrolladores de WordPress son lo suficientemente conocedores del funcionamiento interno del núcleo 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. Supongamos que instalan un complemento mal escrito que rompe sus publicaciones relacionadas en su única publicación, ¿cómo sabrán qué causó eso? ¿Podrán resolverlo ellos mismos o serán la centésima persona que escribe un correo electrónico al autor del tema sobre este problema o publica una pregunta en este sitio?

Mi pregunta: ¿Cómo puede protegerse contra los problemas causados por otro código importado cuando un $post como global es tan poco confiable? ¿Deberíamos estar usando un global como $post ? ¿Cuáles son las alternativas?

Solo para compartir mi mente aquí antes de concluir: he pensado (y visto en algunos temas y complementos, también) usando wp_reset_postdata() o wp_reset_query() antes de usar $post , para asegurar que global se está restableciendo al $post de la consulta principal. 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 cual 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í como $wp_query->post .

Cualquier comentario sobre esto será apreciado.

    
pregunta Pieter Goosen 07.11.2014 - 07:32

1 respuesta

16

Hay una triste verdad: nunca puedes estar seguro de que el código algo no romperá tu código , y no tienes nada Se puede hacer para evitar eso. Especialmente en WordPress, donde todo es global.

Dicho esto, sí, global $post es una de las variantes globales más utilizadas, por lo que usar care especial para ello puede ser una buena idea.

En mi código, rara vez accedo directamente a $post global.

Cuando estoy en singular concurso, uso get_queried_object() y generalmente verifico si $post es una instancia de WP_Post válida:

$post = get_queried_object();

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

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

Considere que get_queried_object() devuelve un valor inesperado si algún código usa query_posts , pero bueno, si alguien usa código que se basa en query_posts , lo merecen si su sitio se rompe :)

Además, si espero algunas condiciones, las verifico, por ejemplo. tipos de correos específicos 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 realiza un bucle, llamar a the_post() restablece el objeto de la publicación, por lo que debería estar bien. Entonces es mi responsabilidad llamar a wp_reset_postdata() después de una consulta personalizada, y lo hago, por supuesto :)

    
respondido por el gmazzap 07.11.2014 - 13:37

Lea otras preguntas en las etiquetas