the_title() mostra il titolo del primo articolo invece del titolo della pagina?
Mi capita occasionalmente questo problema e non sono sicuro di cosa lo causi, qualche idea?
<?php get_header(); ?>
<div class="content" role="main">
<h1><?php the_title(); ?></h1>
<?php get_template_part( 'loop', 'index' ); ?>
</div>
<?php get_footer(); ?>
Per una pagina normale the_title restituisce "Titolo della pagina".
Ma per un blog (usando loop.php come nel file index qui sopra) restituisce "Titolo del primo articolo".
Qualche idea?
the_title
è un tag del Loop. "Mostra o restituisce il titolo del post corrente" e dovrebbe essere utilizzato all'interno del Loop, non al di fuori di esso.
Quello che stai facendo – chiamarlo al di fuori del Loop – non è del tutto corretto e stai ottenendo risultati inconsistenti. Ecco cosa succede:
- La variabile
$post
viene impostata sul primo post del Loop molto presto durante il caricamento della pagina. Per alcune pagine, come le pagine di singoli post che hanno solo un post nel Loop, questo significa che$post
è "la pagina su cui ti trovi" – più o meno. Per le pagine di archivio, è il primo post nel Loop. Puoi inserirevar_dump($post);
prima chewp_head
venga eseguito e vedere che la variabile è già impostata. - Tag come
the_title
utilizzano quella variabile globale$post
. Devi tracciarlo attraverso un paio di funzioni per arrivarci, ma alla fine arrivi alla funzioneget_post
e puoi vedere nel sorgente che è così. In questo caso, la catena èthe_title
->get_the_title
->get_post
Quindi, quello che stai descrivendo è esattamente ciò che dovrebbe succedere. Stai utilizzando il tag in modo errato. A volte funziona come desideri solo a causa di una peculiarità del codice. Non è davvero pensato per funzionare in quel modo, almeno così mi sembra.
Se vuoi ottenere "la pagina su cui ti trovi", a volte dovrai usare get_queried_object
, ma fai attenzione perché restituisce tipi di dati diversi a seconda della pagina e, per alcune pagine, restituisce NULL
. In altri casi, è meglio usare i condizionali come is_home
, is_category
, ecc. piuttosto che affidarsi ai dati della query in quel modo. In effetti, nella maggior parte dei casi è meglio usare quei condizionali o semplicemente una chiamata a wp_title
come suggerisce toscho, ma il contesto in cui stai cercando di utilizzarlo mi fa dubitare che sia corretto. Inoltre, l'output di wp_title
può essere, e spesso viene, manipolato da plugin (come i plugin SEO), il che potrebbe o meno essere ciò che desideri.

Grazie per aver condiviso questo. In un momento di difficoltà, ha risolto il mio problema.

Grazie, ero veramente confuso sul perché $post nella pagina del negozio woocommerce (che usa archive-product.php) puntasse al primo elemento del negozio. Pensavo che $post avrebbe dovuto puntare alla pagina del negozio stessa (dato che avevo bisogno di recuperare alcuni campi personalizzati da essa)

Mi è appena capitata la stessa cosa oggi, ma ho trovato un'ottima soluzione:
<?php
if ( is_front_page() ) {
echo "Home";
} else if (is_single()) { // POST, non necessario per il mio sito
echo "";
} else if (is_page()) { // PAGINA
echo get_the_title();
} else if(is_category()) {
$arr = get_the_category();
if ( ! empty( $arr ) ) {
echo esc_html( $arr[0]->name );
}
}
