¿Cuándo usar global $post y otras variables globales?
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
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.

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.

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.
