ГлавнаяРазноеФункция 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 и первой конференции WordCamp в России. Работал в Automattic, WordPress.com, WooCommerce. Принимает активное участие в развитии ядра WordPress. Любимый язык программирования: Python.

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

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