the_title() muestra el título de la primera entrada en lugar del título de la página
Me enfrento ocasionalmente a este problema y no estoy seguro de qué lo causa, ¿alguna idea?
<?php get_header(); ?>
<div class="content" role="main">
<h1><?php the_title(); ?></h1>
<?php get_template_part( 'loop', 'index' ); ?>
</div>
<?php get_footer(); ?>
Para una página normal the_title devuelve "Título de la página".
Pero para un blog (usando loop.php como en el archivo index anterior) devuelve "Título de la primera entrada".
¿Alguna idea?
the_title
es una etiqueta del Loop. "Muestra o retorna el título de la entrada actual" y se supone que debe usarse dentro del Loop, no fuera de él.
Lo que estás haciendo— llamándola fuera del Loop— no es del todo correcto, y estás obteniendo resultados inconsistentes. Lo que sucede es esto:
- La variable
$post
se establece en la primera entrada del Loop muy temprano en la carga de la página. Para algunas páginas, como páginas de entradas individuales que tienen solo una entrada en el Loop, eso significa que$post
es "la página en la que estás"— más o menos. Para páginas de archivo, es la primera entrada en el Loop. Puedes colocarvar_dump($post);
antes de que se ejecutewp_head
y ver que la variable ya está establecida. - Etiquetas como
the_title
usan esa variable global$post
. Tienes que rastrearla a través de un par de funciones para llegar allí, pero eventualmente llegas a la funciónget_post
y puedes ver en el código fuente que este es el caso. En este caso, la cadena esthe_title
->get_the_title
->get_post
Entonces, lo que describes es exactamente lo que debería estar sucediendo. Estás usando la etiqueta incorrectamente. A veces funciona como quieres solo por una peculiaridad del código. Realmente no se supone que funcione de esa manera, o al menos así me parece.
Si quieres "la página en la que estás", a veces necesitarás usar get_queried_object
, pero ten cuidado ya que retorna diferentes tipos de datos dependiendo de la página, y para algunas páginas retorna NULL
. En otros casos, es mejor usar los condicionales como is_home
, is_category
, etc. que depender de los datos de la consulta de esa manera. De hecho, en la mayoría de los casos es mejor usar esos condicionales, o simplemente una llamada a wp_title
como sugiere toscho, pero el contexto en el que intentas usar esto me hace preguntarme si eso es correcto. Además, el resultado de wp_title
puede ser, y frecuentemente es, manipulado por plugins (plugins de SEO por ejemplo), lo que puede o no ser lo que deseas.

Gracias, estaba realmente confundido sobre por qué $post en la página de tienda de WooCommerce (que usa archive-product.php) apuntaba al primer elemento de la tienda. Asumí que $post apuntaría a la página de la tienda en sí (ya que necesitaba obtener algunos campos personalizados de la misma)

Me acaba de pasar lo mismo hoy, pero encontré una gran solución:
<?php
if ( is_front_page() ) {
echo "Inicio";
} else if (is_single()) { // POST, no necesario para mi sitio
echo "";
} else if (is_page()) { // PÁGINA
echo get_the_title();
} else if(is_category()) {
$arr = get_the_category();
if ( ! empty( $arr ) ) {
echo esc_html( $arr[0]->name );
}
}
