¿Cuándo usar global $post y otras variables globales?

5 dic 2014, 11:44:43
Vistas: 64.3K
Votos: 11

Estoy tratando de entender cuándo y por qué debería usar la variable global $post. He intentado hacer lo siguiente en una página de entrada, fuera del loop, y como era de esperar funciona.

    <?php 
        global $post;
        echo $post->ID;
    ?>

Si hago lo mismo en una página de archivo (solo quería ver qué sucede), por alguna razón también funciona, recuperando el ID de la entrada anterior, incluso si eliminé el código anterior de la página de entrada anterior. ¿Es esto como algún tipo de caché? ¿Cómo funciona exactamente?

Entiendo que global $post puede ser útil si estoy trabajando en una función en functions.php. ¿Es este el único caso de uso?

Muchas gracias

0
Todas las respuestas a la pregunta 2
2
22

Esta es quizás una pregunta demasiado amplia para responder adecuadamente. La variable global $post podría usarse de muchas maneras. Si debe usarse o no depende de cada circunstancia.

Sin embargo, según mi entendimiento, el propósito principal de la variable global $post es su uso en los archivos de plantilla del tema.

Cuando usas the_title(), the_content(), the_author() o cualquiera de las muchas funciones de plantilla, WordPress busca esta información en la variable global $post. Como regla general, cuando trabajas en los archivos de plantilla, siempre querrás usar estas funciones de plantilla, como get_the_ID(), en lugar de acceder directamente a $post->ID.

Así que si quieres entender mejor la variable global $post, deberías leer sobre cómo funciona El Loop en WordPress, particularmente dentro de los archivos de plantilla. Cuando un Loop ejecuta the_post(), está configurando la variable global con el elemento actual.

En los archivos de plantilla, usualmente estarás iterando sobre un Loop para una consulta que se ejecuta automáticamente. Cuando accedes a una Página individual, por ejemplo, WordPress sabe ejecutar una consulta para esa página y cargar la plantilla page.php.

Si quieres recuperar publicaciones adicionales fuera del Loop principal, por ejemplo en tu functions.php, ejecutarías tu propia WP_Query, iniciarías el Loop y luego usarías las funciones de plantilla. Solo accedas directamente a la variable global $post si no puedes obtener la información que necesitas a través de una función existente.

Cuando termines de iterar sobre tu propia WP_Query, notarás que la variable global $post ahora está "atascada" en tu consulta personalizada. Por ejemplo, en nuestra plantilla de página individual, después de nuestro Loop personalizado, puede que ya no tengamos la página actual configurada en $post. Puedes restaurar la variable global $post a su estado anterior con wp_reset_query. Esto es absolutamente crítico o podrías romper otros plugins o temas que esperan la variable global $post original.

5 dic 2014 12:48:47
Comentarios

Gracias por tomarte el tiempo de responderme, ahora me queda un poco más claro: básicamente tengo que usarlo solo en funciones, porque generalmente estoy dentro de un loop predeterminado o una consulta personalizada.

akmur akmur
5 dic 2014 14:32:51

Gracias por la respuesta articulada, ya que ha sido de mucha ayuda y seguirá siéndolo. La información más notable que necesitaba era "Solo accedas directamente al global $post si no puedes acceder a la información que deseas a través de una función existente."

Radmation Radmation
6 abr 2021 20:33:29
1

He publicado un par de entradas sobre esto que podrían haber carecido de información, ya que esta pregunta aborda otros problemas. También he hecho una pregunta que puedes consultar aquí con una gran respuesta de @G.M.

Básicamente, la variable global $post se establece mediante $wp_query->the_post() y es accesible en toda la plantilla, no solo dentro del bucle. Por eso se llaman variables globales.

Aquí está el código fuente actual

3681        public function the_post() {
3682                global $post;
3683                $this->in_the_loop = true;
3684
3685                if ( $this->current_post == -1 ) // el bucle acaba de comenzar
3686                        /**
3687                         * Se ejecuta una vez que el bucle ha comenzado.
3688                         *
3689                         * @since 2.0.0
3690                         *
3691                         * @param WP_Query &$this La instancia de WP_Query (pasada por referencia).
3692                         */
3693                        do_action_ref_array( 'loop_start', array( &$this ) );
3694
3695                $post = $this->next_post();
3696                setup_postdata($post);
3697        }
3698

De esto también obtienes la respuesta a tu pregunta sobre por qué obtienes la última publicación como $post en la página de archivo (y en cualquier página). $post siempre se establece efectivamente en la última publicación del array $posts devuelto a través de $wp_query->next_post().

Debes tener mucho cuidado al usar esta variable global fuera del bucle, ya que consultas personalizadas y algunas funciones pueden acceder a ella y cambiar su valor como se describe en la publicación enlazada. Esa es una de las razones por las que siempre debes restablecer los datos de la publicación de una nueva instancia de WP_Query. query_posts también rompe esta variable global ya que interrumpe la consulta principal, una razón por la que query_posts debe evitarse a toda costa.

Básicamente, solo necesitas definir la variable global $post en una función, ya que esto está fuera de la plantilla actual, pero también puedes definirla fuera del bucle si lo deseas.

Para concluir, dado que la variable global $post es una de las menos confiables y puede modificarse fácilmente por funciones, recomendaría seguir las recomendaciones de @G.M. en la pregunta enlazada.

5 dic 2014 14:47:09
Comentarios

Gracias, buena respuesta, no estoy seguro de cuál elegir como correcta, ambas son igualmente buenas

akmur akmur
5 dic 2014 16:15:00