Как отобразить дату как сегодня, вчера, а далее как обычно в системе указано?

Ссылка скопирована
1 ответ

Есть вот такой код, который выводит на всем сайте дату как сегодня, вчера, месяц назад, 2 года назад.

function wph_human_date($hdate = '') {     if (!is_admin()) {         $hdate = human_time_diff(get_the_time('U'),          current_time('timestamp')) . ' назад';     }    return $hdate; } add_filter('get_the_date', 'wph_human_date');

function wph_human_date($hdate = '') { if (!is_admin()) { $hdate = human_time_diff(get_the_time('U'), current_time('timestamp')) . ' назад'; } return $hdate; } add_filter('get_the_date', 'wph_human_date');

Но мне нужно чтобы отображались только сегодня и вчера, а далее уже 15.11.2023 также как и 5.2.2020

Дополнительно:

Как отобразить дату как сегодня, вчера, а далее как обычно в системе указано?

Что-то вроде этого?

function wph_human_date($hdate = '') {     if (!is_admin()) {         $post_date = get_the_time('d.m.Y');         $current_date = date('d.m.Y');          if ($post_date === $current_date) {             $hdate = 'сегодня';         } elseif ($post_date === date('d.m.Y', strtotime('-1 day', strtotime($current_date)))) {             $hdate = 'вчера';         } else {             $hdate = $post_date;         }     }     return $hdate; }  add_filter('get_the_date', 'wph_human_date');

function wph_human_date($hdate = '') { if (!is_admin()) { $post_date = get_the_time('d.m.Y'); $current_date = date('d.m.Y'); if ($post_date === $current_date) { $hdate = 'сегодня'; } elseif ($post_date === date('d.m.Y', strtotime('-1 day', strtotime($current_date)))) { $hdate = 'вчера'; } else { $hdate = $post_date; } } return $hdate; } add_filter('get_the_date', 'wph_human_date');

  • Почти. Этот код выдал ошибку после записей от даты "сегодня"
    Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 4096 bytes) in /www/wwwroot/vicka.ru/wp-includes/plugin.php on line 173

    Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 4096 bytes) in /www/wwwroot/vicka.ru/wp-includes/plugin.php on line 173

    и далее записи не отобразились

  • VEri63, немного поменял скрипт, попробуйте этот вариант
  • Павел Романов, так работает, спасибо

Ответы:

Есть плагин https://ru.wordpress.org/plugins/today-yesterday-dates/

  • Звучит хорошо, если бы не

    Этот плагин не тестировался с последними 3 основными выпусками WordPress. Скорее всего, он уже не поддерживается и может быть несовместим с текущими версиями WordPress.

    . Все таки рано или поздно даже самые простые плагины начинают не работать в новых версиях wp.

  • Сниппеты точно так же рано или поздно перестают работать, потому что от плагинов они, по большому счету, отличаются только "оберткой". А по сути это те же обработчики тех же хуков.
  • VEri63, можешь написать Флектору чтобы обновил дату релиза, он наш :) Можно прям на форум поддержки плагина писать по-русски
  • YBB, бывает и такое, но не всегда
  • Refguser, если писать то скорее не на этом форуме, т.к. на годовалой давности вопрос там даже не было отвечено почему-то
  • VEri63, да куда угодно. За спрос не бьют в нос :)
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
WordPress-редакция Ответ

Для вывода даты как “сегодня”, “вчера”, а для остальных дней в обычном формате нужно сравнивать дату записи с текущей датой в часовом поясе WordPress. Не используйте просто time() и системный timezone сервера: на хостинге он может отличаться от настроек сайта.

Пример фильтра для get_the_date():

add_filter('get_the_date', function ($the_date, $format, $post) {
    if (!$post instanceof WP_Post) {
        return $the_date;
    }
 
    $post_ts = get_post_timestamp($post);
    if (!$post_ts) {
        return $the_date;
    }
 
    $today = wp_date('Y-m-d');
    $post_day = wp_date('Y-m-d', $post_ts);
    $yesterday = wp_date('Y-m-d', current_time('timestamp') - DAY_IN_SECONDS);
 
    if ($post_day === $today) {
        return 'Сегодня';
    }
 
    if ($post_day === $yesterday) {
        return 'Вчера';
    }
 
    return wp_date($format ?: get_option('date_format'), $post_ts);
}, 10, 3);

add_filter('get_the_date', function ($the_date, $format, $post) { if (!$post instanceof WP_Post) { return $the_date; } $post_ts = get_post_timestamp($post); if (!$post_ts) { return $the_date; } $today = wp_date('Y-m-d'); $post_day = wp_date('Y-m-d', $post_ts); $yesterday = wp_date('Y-m-d', current_time('timestamp') - DAY_IN_SECONDS); if ($post_day === $today) { return 'Сегодня'; } if ($post_day === $yesterday) { return 'Вчера'; } return wp_date($format ?: get_option('date_format'), $post_ts); }, 10, 3);

Если нужно показывать ещё и время, верните например Сегодня в 14:30. Только не забывайте, что фильтр может затронуть все места сайта: архивы, карточки, single, виджеты.

Если изменение нужно только в одном шаблоне, лучше не ставить глобальный фильтр, а сделать функцию my_human_date($post_id) и вызвать её там, где нужно. Так меньше риск сломать SEO-разметку, sitemap или микроразметку, где ожидается обычная дата.

Отдельно проверьте записи, опубликованные около полуночи. Именно там чаще всего появляются ошибки: сервер уже считает день новым, а WordPress в своей временной зоне ещё нет. Поэтому сравнение через wp_date() и current_time('timestamp') надёжнее, чем прямой date().

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно