the_title() muestra el título de la primera entrada en lugar del título de la página

12 mar 2013, 21:30:54
Vistas: 19.8K
Votos: 8

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?

0
Todas las respuestas a la pregunta 5
0
10

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:

  1. 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 colocar var_dump($post); antes de que se ejecute wp_head y ver que la variable ya está establecida.
  2. 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ón get_post y puedes ver en el código fuente que este es el caso. En este caso, la cadena es the_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.

12 mar 2013 22:07:16
2

En las páginas de archivo - blog, año, categoría y demás - utiliza wp_title() para obtener el título de la página. the_title() depende de los datos de una sola entrada.

12 mar 2013 22:27:44
Comentarios

Gracias por compartir esto. En un apuro, esto solucionó mi problema.

Pegues Pegues
16 ene 2019 19:00:42

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)

finitenessofinfinity finitenessofinfinity
8 dic 2023 15:35:25
0

En las páginas de archivo – blog, año, categoría, etc. – utiliza single_cat_title() para obtener el título de la página. Espero que esto te ayude.

24 ene 2017 10:37:49
0

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 );   
      }
    }
15 jun 2016 14:18:26
0

Una cosa que puede ayudarte es ir a

Escritorio de WordPress>Ajustes>Lectura>Página de entradas

Funcionó en mi caso.

17 may 2020 18:21:46