Отображение даты и времени в цикле WordPress

Добавление времени и даты в цикл WordPress кажется довольно простой задачей, верно?

 

Ну, хорошо. Нужно закодить простой тег для шаблона и позволить WordPress сделать всё остальное. Но иногда можно повстречаться с проблемами.

 

В этом коротком уроке, я покажу разные функции WordPress, позволяющие отображать дату и время, и расскажу какую из них использовать, если у вас возникли трудности.

 

Доступные теги шаблона

 

У WordPress есть четыре функции для вывода даты и/или времени. Вот они:

 

  • the_date(). По умолчанию, это выводит дату записи (поста) в формате F j, Y, поэтому, если запись была опубликована 20 ноября 2018 года, то это выдаст Ноябрь 20, 2018.
  • get_the_date() — эта функция возвращает дату, но не выводит её. Чтобы вывести её, используйте echo get_the_date(), что даст вам тот же результат, что и the_date(). Это полезно, если в вашем коде уже используется echo. Это также поможет обойти проблему с не отображением дат, вскоре увидите.
  • the_time() и get_the_time() — по умолчанию, с помощью них вы получите время, но, если укажите формат даты, то получите и дату. Вы конечно можете использовать их для вывода даты, если зададите её формат, но для даты всё же разумнее использовать the_date() или echo get_the_date().

Форматирование даты

 

У каждой функции есть определённый формат, который вы можете переопределить, если пожелаете. Для этого, нужно использовать PHP стандарт форматирования даты и времени.

 

Вот некоторые примеры для материалов, опубликованных 20 ноября 2018.

 

  • the_date() по умолчанию выведет Ноябрь 20, 2018.
  • echo get_the_date( l, S M Y ) выдаст Вторник, 20 нояб 2018.
  • the_time( 'g:i a' ) выдаст 2:03 pm.
  • echo get_the_time( 'G:i' ) выдаст нам 14:03.
  • the_time( 'g:i a, D, j F y' ) выдаст 2:03 pm, Вт, 20 ноября 18.

Решение проблем с датами в цикле: отсутствующие даты на странице архивов

 

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

 

Вы, конечно, можете оставить это как есть, если не хотите повторять дату для каждой записи того же дня.

 

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

 

Наипростейший способ решения, это заменить the_date() на echo get_the_date(). Если хотели добавить ещё и время, тогда подойдут либо the_time(), либо echo get_the_time().

 

Примечание: если вас смущает тот факт, что the_date() имеет такую проблему, а the_time() нет, так это потому, что записи опубликованы в ту же дату, но в разное время. Нужно будет приложить много усилий, на планирование сообщений, редактирование времени публикаций или координация усилий двух блоггеров, чтобы такое произошло!

 

У меня была такая проблема в шаблоне главной страницы темы, которую я делала для клиента. В этом шаблоне было множество циклов для разных типов содержимого и во всех использовался WP_Query. Проблема не была очевидной до того дня, когда они добавили несколько записей (чего они обычно не делали). Они были озадачены тем, почему дата второй записи не появилась на домашней странице и продолжали её редактировать, обновлять и пересоздавать, пока не сдались и не спросили у меня.

 

Вот исходный код:

 

<ul class="newsletters">
    <?php $query = new WP_Query( array(
  	'post_type' => 'post',
		'category_name' => 'newsletters',
		'posts_per_page' => 8
	) );
	while ($query->have_posts()) : $query->the_post(); ?>
	<li class="home newsletter"><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php the_date( 'j F' ); ?></a></li>
	<?php endwhile; ?>
</ul>

 

Я отредактировал одну функцию и теперь она выглядит вот так:

 

<ul class="newsletters">
    <?php $query = new WP_Query( array(
		'post_type' => 'post',
		'category_name' => 'newsletters',
		'posts_per_page' => 8
	) );
	while ($query->have_posts()) : $query->the_post(); ?>
	<li class="home newsletter"><a href="<?php the_permalink(); ?>"><?php the_title(); ?> - <?php echo get_the_date( 'j F' ); ?></a></li>
	<?php endwhile; ?>
</ul>

 

В строке, начинающейся с li class="home newsletter", я заменила the_date( 'j, F' ) на echo get_the_date( 'j, F' ). Это исправило проблему.

 

Так что, если вы когда-нибудь обнаружите, что даты не показываются в ваших архивах, то это может быть решением.