Дата не отображается у записей с одинаковой датой публикации
У меня есть произвольный тип записи "press" и создан шаблон страницы, который выводит записи этого типа. Записи должны показывать дату публикации, но если есть несколько записей с одинаковой датой, только первая запись показывает дату, а остальные - нет. Как можно отобразить дату для каждой записи?
<?php get_header(); ?>
<?php
$wp_query = new WP_Query();
$wp_query -> query('post_type=press&showposts=100');
while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
<div id="press">
<div class="press-item cf">
<div class="press-img"><a href="<?php the_field('link'); ?>"><?php the_post_thumbnail('medium');?></a> </div>
<div class="press-content">
<div class="press-title"><a href="<?php the_field('link'); ?>"><?php echo get_the_title(); ?></a> </div>
<div class="press-excerpt"><?php the_excerpt(); ?> </div>
<div class="press-date"><?php the_date(); ?></div>
</div>
</div>
</div>
<?php endwhile; ?>
<?php get_footer(); ?>

Я сталкивался с похожей проблемой в прошлом, потому что модифицировал свою функцию даты. И тогда посты отображали дату только если у каждого поста была разная дата, в противном случае возвращался пустой результат.
Попробуйте добавить <?php echo get_the_date(); ?>
вместо этого.

Почему дата не отображается?
Если посмотреть исходный код функции the_date()
, можно заметить две глобальные переменные:
global $currentday, $previousday;
Затем идет проверка, нужно ли отображать дату... или нет. Эта проверка аналогична той, что выполняется в is_new_day()
:
if ( $currentday != $previousday ) {
// показать дату
// Установить глобальную переменную
$previousday = $currentday;
}
// иначе
return null;
Как видите, $previousday
мгновенно устанавливается равной $currentday;
. Таким образом, дата выводится один раз. Сразу после этого оба дня становятся одинаковыми, и проверка не срабатывает. Вот почему дата отображается для первого поста, но не отображается для остальных.
Почему дата отображается?
Если вам интересно, почему иногда отображается несколько дат после того, как глобальные переменные стали равны, вам нужно взглянуть на setup_postdata()
. Эта функция вызывается the_post();
и отвечает за настройку всего для отдельного поста в цикле.
if ( have_posts() )
{
while ( have_posts() )
{
the_post(); # <-- Вызывает setup_postdata( $post );
// ваш код цикла здесь
}
}
Внутренности setup_postdata()
довольно просты для понимания (по крайней мере, в части установки глобальных переменных):
$currentday = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);
Таким образом, ключевыми являются $previousday
и $currentday
. И пока не наступит новый день, функция the_date()
ничего не отобразит.
Просто установите для своих постов совершенно разные даты, и вы увидите, как дата появится у каждого поста.
В чем идея такого поведения?
На самом деле идея довольно проста и присутствует с версии 0.7.1 — по крайней мере, так указано в phpDocBlock: Зачем отображать дату для каждого поста в архиве? Архив выглядит так:
+--------------+
| 28.10.2014 |
+--------------+
| Заголовок A |
| Заголовок B |
+--------------+
| 29.10.2014 |
+--------------+
| Заголовок C |
| Заголовок D |
+--------------+
Вы с этим не согласны? Что ж, значит, вы просто используете функцию, которая изначально задумывалась совсем для другого.
Почему работает get_the_date()
и как использовать её правильно
Эта функция не зависит от условной проверки в the_date()
(проверки глобальных переменных). У неё также нет фильтра. Как это исправить? Очень просто:
echo apply_filters( 'the_date', get_the_date(), get_option( 'date_format' ), '', '' );
Это добавляет все колбэки, прикрепленные к фильтру the_date
, к вашему пользовательскому выводу. Также используется стандартная настройка опции date_format
— точно так же, как в функции the_date()
. И исключаются значения before
и after
— опять же, как в the_date()
.

Спасибо, kaiser. Это объясняет, почему иногда не удается вывести дату. Большое спасибо.

@Nilambar Принятый ответ - это версия tl;dr (слишком длинно, не читал) и вполне подходит :)

Спасибо за глубокий анализ, @kaiser - больше информации, чем я ожидал по такой обыденной проблеме

Не используйте the_date()
, вместо этого используйте the_time()
.
the_date возвращает только дату, the_time возвращает дату + время. Я не знаю причину, почему WordPress не возвращает более одной даты, когда the_date
используется в цикле. Но это связано с тем, что значение одинаковое. Если вы используете the_time
, значение никогда не будет одинаковым, поэтому оно всегда возвращает значение. Таким образом, вы можете вывести что-то вроде <?php the_time('F j, Y'); ?>
Эта ссылка из Codex объясняет, как работает the_date, намного лучше, чем я.

Оно отображается только один раз, потому что так работает дневник. Дата показывается вверху, а записи пишутся под ней. Я использую этот код для отображения даты для каждого поста с помощью функции the_time.
<?php the_time(get_option('date_format')); ?>
Для получения дополнительной информации я написал руководство по этой теме: Почему функция the_date() в WordPress отображается только один раз в первом посте

Обратите внимание, если вы хотите продвигать собственный продукт или блог, вы обязаны раскрыть свою аффилированность, иначе ваш ответ может быть помечен как спам. Пожалуйста, ознакомьтесь с Как не быть спамером
