the_title() показывает заголовок первой записи вместо заголовка страницы?
Я периодически сталкиваюсь с этой проблемой и не уверен, что её вызывает. Есть какие-нибудь идеи?
<?php get_header(); ?>
<div class="content" role="main">
<h1><?php the_title(); ?></h1>
<?php get_template_part( 'loop', 'index' ); ?>
</div>
<?php get_footer(); ?>
Для обычной страницы the_title возвращает "Заголовок страницы".
Но для блога (используя loop.php как в индексном файле выше) он возвращает "Заголовок первой записи".
Есть идеи?
the_title
— это тег цикла (Loop). Он "отображает или возвращает заголовок текущей записи" и предназначен для использования внутри цикла, а не за его пределами.
То, что вы делаете — вызов его вне цикла — не совсем корректно, и вы получаете нестабильные результаты. Вот что происходит:
- Переменная
$post
устанавливается в первую запись цикла очень рано при загрузке страницы. Для некоторых страниц, например, страниц отдельных записей, где в цикле только одна запись, это означает, что$post
— это "страница, на которой вы находитесь" — более или менее. Для архивных страниц это первая запись в цикле. Вы можете добавитьvar_dump($post);
до выполненияwp_head
и увидеть, что переменная уже установлена. - Теги, такие как
the_title
, используют эту глобальную переменную$post
. Вам придётся пройти по цепочке функций, чтобы убедиться в этом, но в конечном итоге вы попадёте в функциюget_post
, и вы можете увидеть в исходном коде, что это действительно так. В данном случае цепочка выглядит так:the_title
->get_the_title
->get_post
.
Таким образом, вы описываете именно то, что должно происходить. Вы используете тег некорректно. Иногда он работает так, как вам нужно, только из-за особенности кода. На самом деле он не должен так работать, по крайней мере, так мне кажется.
Если вам нужна "страница, на которой вы находитесь", иногда вам потребуется использовать get_queried_object
, но будьте осторожны, так как она возвращает разные типы данных в зависимости от страницы, а для некоторых страниц возвращает NULL
. В других случаях лучше использовать условные теги, такие как is_home
, is_category
и т.д., чем полагаться на данные запроса таким образом. На самом деле, в большинстве случаев лучше использовать эти условные теги или просто вызов wp_title
, как предлагает toscho, но контекст, в котором вы пытаетесь это использовать, заставляет меня задуматься, правильно ли это. Кроме того, вывод wp_title
может быть (и часто бывает) изменён плагинами (например, SEO-плагинами), что может быть как желаемым, так и нежелательным эффектом.

Спасибо за эту информацию. В критической ситуации это решило мою проблему.

Спасибо, я был действительно озадачен, почему $post на странице магазина WooCommerce (которая использует archive-product.php) указывал на первый товар в магазине. Я предполагал, что $post должен указывать на саму страницу магазина (так как мне нужно было получить некоторые пользовательские поля оттуда).

Сегодня столкнулся с той же проблемой, но нашел отличное решение:
<?php
if ( is_front_page() ) {
echo "Главная";
} else if (is_single()) { // Запись, не требуется для моего сайта
echo "";
} else if (is_page()) { // Страница
echo get_the_title();
} else if(is_category()) {
$arr = get_the_category();
if ( ! empty( $arr ) ) {
echo esc_html( $arr[0]->name );
}
}
