the_title() afișează titlul primei postări în loc de titlul paginii?
Mă confrunt ocazional cu această problemă și nu sunt sigur ce o cauzează, aveți idei?
<?php get_header(); ?>
<div class="content" role="main">
<h1><?php the_title(); ?></h1>
<?php get_template_part( 'loop', 'index' ); ?>
</div>
<?php get_footer(); ?>
Pentru o pagină normală the_title returnează "Titlul paginii".
Dar pentru un blog (folosind loop.php ca în fișierul index de mai sus) returnează "Titlul primei postări".
Aveți idei?
the_title
este un tag din Buclă (Loop). Acesta "afișează sau returnează titlul postării curente" și ar trebui utilizat în interiorul Buclei, nu în afara acesteia.
Ceea ce faci tu — apelându-l în afara Buclei — nu este chiar corect și obții rezultate inconsistente. Iată ce se întâmplă:
- Variabila
$post
este setată la prima postare din Bucă chiar la începutul încărcării paginii. Pentru unele pagini, cum ar fi paginile de postări unice care au doar o singură postare în Bucă, aceasta înseamnă că$post
este "pagina pe care te afli" — mai mult sau mai puțin. Pentru paginile de arhivă, este prima postare din Bucă. Poți punevar_dump($post);
înainte cawp_head
să ruleze și vei vedea că variabila este deja setată. - Tag-uri precum
the_title
folosesc acea variabilă globală$post
. Trebuie să urmărești lanțul prin câteva funcții, dar în final ajungi la funcțiaget_post
și poți vedea în sursă că așa stau lucrurile. În acest caz, lanțul estethe_title
->get_the_title
->get_post
Deci, ceea ce descrii tu este exact ce ar trebui să se întâmple. Folosești tag-ul incorect. Uneori funcționează așa cum vrei doar datorită unui detaliu al codului. Nu este menit să funcționeze în acest fel, cel puțin așa mi se pare.
Dacă vrei "pagina pe care te afli", uneori va trebui să folosești get_queried_object
, dar fii atent deoarece returnează diferite tipuri de date în funcție de pagină, iar pentru unele pagini returnează NULL
. În alte cazuri, este mai bine să folosești is_home
, is_category
, etc. condiționale decât să te bazezi pe datele interogării. De fapt, în majoritatea cazurilor este mai bine să folosești acele condiționale sau doar un apel la wp_title
cum sugerează toscho, dar contextul în care încerci să folosești acest lucru mă face să mă întreb dacă este corect. În plus, ieșirea lui wp_title
poate fi, și frecvent este, manipulată de plugin-uri (de exemplu, plugin-uri SEO), ceea ce poate fi sau nu ceea ce dorești.

Mulțumesc pentru împărtășire. Într-o situație urgentă, asta a rezolvat problema mea.

Mulțumesc, am fost foarte confuz de ce $post pe pagina magazinului woocommerce (care folosește archive-product.php) indica spre primul produs din magazin. Am presupus că $post va indica spre pagina magazinului în sine (deoarece aveam nevoie să preiau câteva câmpuri personalizate de acolo)

Tocmai am întâlnit aceeași problemă astăzi, dar am găsit o soluție excelentă:
<?php
if ( is_front_page() ) {
echo "Acasă";
} else if (is_single()) { // POST, nu este necesar pentru site-ul meu
echo "";
} else if (is_page()) { // PAGINĂ
echo get_the_title();
} else if(is_category()) {
$arr = get_the_category();
if ( ! empty( $arr ) ) {
echo esc_html( $arr[0]->name );
}
}
