ГлавнаяРазноеФункция human_time_diff() в WordPress

Функция human_time_diff() в WordPress

Функция human_time_diff() позволяет получить разницу между двумя заданными отметками во времени, в удобном для восприятия формате, например 5 минут, 10 часов, 9 дней и т.д.

Такое отображение часто встречается вместо даты публикации в различных социальных сетях, например Twitter и Facebook. Это позволяет читателям быстрее понять «свежесть» контента, не задумываясь о том, какое сегодня число.

Время публикации в Facebook

Время публикации в Facebook

Подобное отображение все чаще и чаще стало встречаться и в темах для WordPress. Это позволяет легко реализовать встроенная функция human_time_diff().

Аргументы

Функция human_time_diff() принимает всего два аргумента:

  • $from — обязательный аргумент, начало временного диапазона
  • $to — конец временного диапазона, используется текущее время по умолчанию

В обоих аргументах используется время в формате timestamp (отметка времени) — количество секунд с 1 января 1970 года. Значения в таком формате позволяют получить встроенные функции PHP time() и mktime(), а также встроенные функции WordPress get_the_time() и current_time().

Функция human_time_diff() возвращает разницу между двумя отметками в виде количества секунд, минут, часов, дней, недель, месяцев или лет. Например:

echo human_time_diff( time() - 60 ); // 1 минута
echo human_time_diff( time() - 3600 ); // 1 час
echo human_time_diff( time() - 259200 ); // 3 дня

Обратите внимание, что в данных примерах не задан второй аргумент $to. В этом случае WordPress использует отметку текущего времени с помощью функции time().

Примеры human_time_diff()

Рассмотрим простой пример, который в цикле записей темы WordPress выводит время ее публикации в формате human_time_diff:

while ( have_posts() ) {
    the_post();
    // ... вывод заголовка, контента и т.д.

    $human_time = human_time_diff( get_the_time( 'U' ), current_time( 'timestamp' ) );
    printf( 'Опубликовано %s назад.', $human_time );
}

Функция get_the_time() позволяет получить отметку времени опубликованной записи, в требуемом нам формате, но учтите что данная функция использует настройки часового пояса, которые можно изменить в разделе Параметры → Общие в панели администрирования WordPress.

Именно поэтому мы указали второй аргумент к функции human_time_diff() и воспользовались встроенной функцией WordPress current_time(), которая также принимает во внимание настройки часового пояса, в отличие от функции по умолчанию time().

Иными словами, убедитесь, что оба значения передаваемые в human_time_diff() находятся в одном часовом поясе. Вы можете также использовать функцию get_post_time() вместо get_the_time(). Она позволяет получить отметку времени в часовом поясе GMT/UTC:

$human_time = human_time_diff( get_post_time( 'U', true ) );

Здесь можно не указывать второй аргумент к функции human_time_diff() поскольку по умолчанию используется функция time(), которая также возвращает отметку времени в часовом поясе GMT/UTC.

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

$human_time = human_time_diff( get_post_time( 'U', true ) );
$iso8601_time = get_the_time('c');
printf( '<span class="entry-date published" datetime="%s">Опубликовано %s назад.</span>', $iso8601_time, $human_time );

Таким образом посетители сайта будут видеть дату в удобном для них формате human_time_diff, а поисковые системы смогут прочитать дату в формате ISO 8601 в микроразметке.

Последний пример — вывод даты в формате human_time_diff только если статья была опубликована менее недели назад:

$human_time = human_time_diff( get_post_time( 'U', true ) );
$regular_time = get_the_time( get_option( 'date_format' ) );
$output_time = sprintf( '%s назад', $human_time );

if ( time() > get_post_time( 'U', true ) + 7 * DAY_IN_SECONDS )
    $output_time = $regular_time;

printf( 'Опубликовано %s.', $output_time );

Если с момента публикации статьи прошло больше 7 дней (см. константы для работы со временем), то данный код выведет дату в формате, который установлен в настройках сайта.

Реализацию функции human_time_diff() можно посмотреть в файле wp-includes/formatting.php. Она использует функции локализации и при наличии русского пакета переводов для WordPress, хорошо справляется с формами множественных чисел (1 день, 2 дня, 5 дней). Подробнее о функциях get_the_time() и get_post_time() вы можете прочитать в кодексе.

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!

  • Спасибо! Давно было интересно

  • Виталий Шибалков

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

    • Примем к сведению.

  • Alexandr Basun

    Очень клёва, спасибо за информацию, раньше такая штука решалась плагином или функцией :)

  • Souz2000

    А как изменить вывод строки «Опубликовано 1 минута назад.» на «Опубликовано 1 минуту назад.»?

    • К сожалению это один из недостатков данной функции. В ней нет контекста, она лишь возвращает разницу во времени, потому и «минута» вместо «минуту» и «неделя» вместо «неделю», по крайней мере для русского языка.

      Добавить контекст можно в самостоятельной подобной функции, т.е. в функции локализации _n() передавать строку целиком: «%s mins ago». В качестве примера вы можете посмотреть как мы это реализовали в нашей теме Semicolon.

  • Добрый день! А как исправить микроразметку в комментариях?

    «Ошибка. If this markup is about a person, at least 2 of the following fields are needed: organization, location, or role.»

    • Судя по тексту ошибки необходимо добавить организацию, место положение или роль, только это никак не относится к теме данной статьи :)