the_title() показывает заголовок первой записи вместо заголовка страницы?

12 мар. 2013 г., 21:30:54
Просмотры: 19.8K
Голосов: 8

Я периодически сталкиваюсь с этой проблемой и не уверен, что её вызывает. Есть какие-нибудь идеи?

<?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 как в индексном файле выше) он возвращает "Заголовок первой записи".

Есть идеи?

0
Все ответы на вопрос 5
0
10

the_title — это тег цикла (Loop). Он "отображает или возвращает заголовок текущей записи" и предназначен для использования внутри цикла, а не за его пределами.

То, что вы делаете — вызов его вне цикла — не совсем корректно, и вы получаете нестабильные результаты. Вот что происходит:

  1. Переменная $post устанавливается в первую запись цикла очень рано при загрузке страницы. Для некоторых страниц, например, страниц отдельных записей, где в цикле только одна запись, это означает, что $post — это "страница, на которой вы находитесь" — более или менее. Для архивных страниц это первая запись в цикле. Вы можете добавить var_dump($post); до выполнения wp_head и увидеть, что переменная уже установлена.
  2. Теги, такие как 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-плагинами), что может быть как желаемым, так и нежелательным эффектом.

12 мар. 2013 г. 22:07:16
2

На страницах архивов – блога, года, категории и так далее – используйте wp_title() для получения заголовка страницы. the_title() зависит от данных отдельной записи.

12 мар. 2013 г. 22:27:44
Комментарии

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

Pegues Pegues
16 янв. 2019 г. 19:00:42

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

finitenessofinfinity finitenessofinfinity
8 дек. 2023 г. 15:35:25
0

На страницах архивов – блог, год, категория и так далее – используйте single_cat_title() для получения заголовка страницы. Надеюсь, это поможет вам.

24 янв. 2017 г. 10:37:49
0

Сегодня столкнулся с той же проблемой, но нашел отличное решение:

  <?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 );   
      }
    }
15 июн. 2016 г. 14:18:26
0

Один из способов, который может вам помочь, это перейти в

Администратор WordPress>Настройки>Чтение>Страница записей

В моем случае это сработало.

17 мая 2020 г. 18:21:46