WordPress как на ладони
Шаблоны, плагины и темы для настоящих поклонников Elementor. От TemplateMonster.com wordpress jino

the_date() WP 0.71

Выводит на экран или получает дату публикации поста или группы постов (опубликованные в один день). Используется в цикле WordPress.

Предназначена только для использования внутри Цикла WordPress.

Дата публикации группы постов означает, что для постов опубликованных в одни день, дата выводиться только для первого поста. Т.е., для каждого следующего поста в цикле, функция проверяет в какой день опубликован этот пост, и если дата текущего поста и предыдущего совпадают, то для этого поста дата не выводиться.

Чтобы выводить дату для всех постов (с версии 3.0) нужно использовать функции: the_time() или get_the_date().

Влияет на возвращаемое значение функции is_new_day(), когда обе функции используются в одной конструкции кода.

Работает на основе: get_the_date(), is_new_day()
✈ 1 раз = 0.000604с = медленно | 50000 раз = 1.38с = быстро PHP 7.2.5, WP 4.9.6
Хуки из функции:

Использование

<?php the_date( $format, $before, $after, $echo ); ?>
$format(строка)
Формат даты (в PHP). Например, j F Y выведет "6 ноября 2011". Подробнее смотрите здесь.
По умолчанию: формат установленный в настройках.
$before(строка)
Текст, который нужно написать перед датой.
По умолчанию: ""
$after(строка)
Текст, который нужно написать после даты.
По умолчанию: ""
$echo(логический)
Установите значение в false, если нужно получить результат, а не выводить его на экран.
По умолчанию: true

Примеры

#1. Выведем дату в формате установленном в настройках WordPress:

<p>Пост опубликован: <?php the_date(); ?></p>

#2. Выведем дату в формате 2007-07-23 и обрамим его в тег <h2>:

<?php the_date('Y-m-d', '<h2>', '</h2>'); ?>

Код the_date: wp-includes/general-template.php VER 4.9.8

<?php
function the_date( $d = '', $before = '', $after = '', $echo = true ) {
	global $currentday, $previousday;

	if ( is_new_day() ) {
		$the_date = $before . get_the_date( $d ) . $after;
		$previousday = $currentday;

		/**
		 * Filters the date a post was published for display.
		 *
		 * @since 0.71
		 *
		 * @param string $the_date The formatted date string.
		 * @param string $d        PHP date format. Defaults to 'date_format' option
		 *                         if not specified.
		 * @param string $before   HTML output before the date.
		 * @param string $after    HTML output after the date.
		 */
		$the_date = apply_filters( 'the_date', $the_date, $d, $before, $after );

		if ( $echo )
			echo $the_date;
		else
			return $the_date;
	}
}

Cвязанные функции

Из метки: loop (Цикл WP)

Еще из метки: date time (дата время)

Еще из раздела: Записи: посты, страницы, ...

Еще из тегов шаблона: Записи: посты, страницы, ...

17 комментов
Полезные 3 Все
  • Допустим, инкогнито

    То, есть, если я буду использовать его в выводе списка статей, то для некоторых статей (которые были опубликованы в 1 день) дата выводится не будет? А есть ли альтернатива, но выводящая дату для всех постов и при том с возможностью не выводить результат? Никак не могу найти подходящую функцию.

    Ответить4.5 года назад #
    • Допустим, инкогнито

      Извините, уже нашел. Кстати, ссылка на get_the_date ведет на the_date

      Ответить4.5 года назад #
  • Андрей cайт: hdmix.net

    Добрый день вывожу дату в таком формате "j F Y" вот что получается (15 март 2015) как сделать чтоб вместо март выводилось марта ?

    Ответить3.5 года назад #
    • Kama6810

      В сети где-то плагин есть russion data. А я вот такой код использую:

      /**
       * Руссифицирует месяца и недели в дате.
       * Функция для фильтра date_i18n.
       * @param строка $date        Дата в принятом формате
       * @param строка $req_format  Формат передаваемой даты
       * @return Дату в русском формате
       */
      function kama_drussify_months( $date, $req_format ){
      	// в формате есть "строковые" неделя или месяц
      	if( ! preg_match('~[FMlS]~', $req_format ) ) return $date;
      
      	$replace = array ( 
      		"январь" => "января", "Февраль" => "февраля", "Март" => "марта", "Апрель" => "апреля", "Май" => "мая", "Июнь" => "июня", "Июль" => "июля", "Август" => "августа", "Сентябрь" => "сентября", "Октябрь" => "октября", "Ноябрь" => "ноября", "Декабрь" => "декабря", 
      
      		"January" => "января", "February" => "февраля", "March" => "марта", "April" => "апреля", "May" => "мая", "June" => "июня", "July" => "июля", "August" => "августа", "September" => "сентября", "October" => "октября", "November" => "ноября", "December" => "декабря", 
      
      		"Jan" => "янв.", "Feb" => "фев.", "Mar" => "март.", "Apr" => "апр.", "May" => "мая", "Jun" => "июня", "Jul" => "июля", "Aug" => "авг.", "Sep" => "сен.", "Oct" => "окт.", "Nov" => "нояб.", "Dec" => "дек.",    
      
      		"Sunday" => "воскресенье", "Monday" => "понедельник", "Tuesday" => "вторник", "Wednesday" => "среда", "Thursday" => "четверг", "Friday" => "пятница", "Saturday" => "суббота",
      
      		"Sun" => "вос.", "Mon" => "пон.", "Tue" => "вт.", "Wed" => "ср.", "Thu" => "чет.", "Fri" => "пят.", "Sat" => "суб.", "th" => "", "st" => "", "nd" => "", "rd" => "",       
      	);
      
      	return strtr( $date, $replace );
      }
      add_filter('date_i18n', 'kama_drussify_months', 11, 2);

      Его как плагин или в functions.php вставьте

      3
      Ответить3.5 года назад #
  • Roman cайт: kurtkin.ru

    Огромное спасибо! Перерыл кучу статей в интернете и только ваша статья помогла решить проблему. Все оказалось легко и просто! good

    Ответить3.3 года назад #
  • Дмитрий

    Добрый день, Тимур. А есть ли способ вывести посты по дате? Например, посты за январь, февраль и т.д.

    Ответить3.3 года назад #
  • Дима

    Подскажите у меня такой массив:

    дата почему-то выводится только в первой строчке

    <span class="line1"><?php the_date('j'); ?></span>
    <span class="line2"><?php the_date('M'); ?></span>
    <span class="line3"><?php the_date('Y'); ?></span>
    Ответить2 года назад #
    • Kama6810

      Начало описания функции прочитай... Там же все написано!

      Дата публикации группы постов означает, что для постов опубликованных в одни день, дата выводиться только для первого поста. Т.е., для каждого следующего поста в цикле, функция проверяет в какой день опубликован этот пост, и если дата текущего поста и предыдущего совпадают, то для этого поста дата не выводиться.

      Чтобы выводить дату для всех постов (с версии 3.0) нужно использовать Теги шаблонов: the_time() или get_the_date().

      Т.е. замени <?php the_date('j'); ?> на <?php echo get_the_date('j'); ?>

      1
      Ответить2 года назад #
  • Закир cайт: nokakdelat.ru

    Как сделать если, сегодня опубликовали запись и дата показывает "Сегодня" а если пройдет день, вместо сегодня появляется "Вчера" а потом дата 15 май 2017

    1
    Ответить1.3 год назад #
    • newbie31 cайт: yumchief.com

      Не знаю точно, как это написать на php, но логика, думаю, такая:

      Если get_post_date() == current_time(), то echo 'Сегодня',
      Если get_post_date() == (current_time() - количество_миллисекунд_в_дне), то echo 'Вчера',
      Иначе echo get_post_date()

    • Kama6810

      Вот код, я юзаю его на этом сайте, он немного адаптивный, вставь его в functions.php и все.

      add_filter( 'date_i18n', array('Kama_Date_Russify', 'russify_months'), 11, 2 );
      add_filter( 'date_i18n', array('Kama_Date_Russify', 'difference'), 11, 3 );
      
      class Kama_Date_Russify {
      
      	/**
      	 * Меняет выводимую дату на разницу: 3 часа назад, 5 дней назад, 7 месяцев назад...
      	 * Функция для фильтра date_i18n.
      	 * Чтобы функция не работала, в формате нужно использовать обратный слэш \. Пр: "j F\ Y", "\д\а\т\а\: j F Y"
      	 *
      	 * @param строка $date       Дата в принятом формате
      	 * @param строка $req_format Формат даты который передается
      	 * @param число  $i          Дата в UNIX формате
      	 * @return Дату в русском формате
      	 */
      	static function difference( $date, $req_format = '', $i = 0 ){
      		// не меняем в админке. быстрая!
      		// выходим, если в формате есть экранированные символы
      		if( is_admin() || false !== strpos( $req_format, '\\') )
      			return $date;
      
      		$outpatt = __('%s назад','km');
      		$cdaypatt = 'j n Y';
      
      		// оптимизация
      		static $cur_time, $cur_day;
      		if( ! $cur_time ) $cur_time = current_time('timestamp', 0);
      		if( ! $cur_day )  $cur_day  = date( $cdaypatt, $cur_time ); // день мес год без лидирующего нуля: 25 12 2015
      
      		// в формате есть время
      		if( preg_match('/[aABgGhHis]/', $req_format ) ){
      			$diff   = $cur_time - $i; // отдельно да!
      			$hours_passed = floor( $diff/3600 );
      
      			// если отрицательно
      			if( $hours_passed < 0 && ($hours_passed *= -1) )
      				$outpatt = __('через %s','km');
      			if( $hours_passed == 0 )
      				return '<span title="'. $date .'">'. __('сейчас','km') .'</span>';
      			if( $hours_passed < 24 )
      				return '<span title="'. $date .'">'. sprintf( $outpatt, self::plural($hours_passed, __('час_часа_часов','km') ) ) .'</span>';
      		}
      
      		// если в формате нет времени или прошло больше 24 часов и в формате есть дата
      		if( ( ! isset($hours_passed) || $hours_passed >= 24 ) && preg_match('/[dDjLNSwz]/', $req_format ) ){
      			$diff = $cur_time - $i;
      			$days_passed = floor( $diff / DAY_IN_SECONDS );
      
      			// если отрицательно
      			if( $days_passed < 0 ){
      				$days_passed *= -1;
      				$outpatt = __('через %s','km');
      			}
      
      			if(0){}
      			elseif( $days_passed == 0 || date($cdaypatt, $i) == $cur_day )
      				return __('сегодня','km');
      			elseif( $days_passed == 1 )
      				return __('вчера','km');
      			// дни
      			elseif( $days_passed < 30 )
      				$out = self::plural( $days_passed, __('день_дня_дней','km') );
      			// месяцы
      			elseif( $days_passed < 365 ){
      				$months_passed = floor( $days_passed / 30.5 ) ?: 1;
      				$outpatt = "<span title=\"$date\">$outpatt</span>";
      				$out = $months_passed == 1 ? __('месяц','km') : self::plural( $months_passed, __('месяц_месяца_месяцев','km') );
      			}
      			// годы
      			elseif( $days_passed >= 365 ){
      				$years_passed  = floor( $days_passed / (30.5 * 12) ) ?: 1; // лет прошло
      				$months_passed = floor( ( $days_passed - ($years_passed*365) ) / 30.5 ) ?: 1; // месяцев прошло
      				$ten_m_part    = intval( round($months_passed/12, 2) * 10 ); // десятая часть месяца
      
      				$outpatt = "<span title=\"$date\">$outpatt</span>";
      				$out = ($years_passed == 1 && ! $ten_m_part) ? __('год','km') : ( $years_passed . ($ten_m_part ? ".$ten_m_part" : '') .' '. self::plural( $years_passed, __('года_года_лет','km'), true ) );
      			}
      
      			return sprintf($outpatt, $out);
      		}
      
      		// если это время, год, штамп времени или ..., то просто возвращаем результат
      		return $date;
      	}
      
      	/**
      	 * Русифицирует месяца и недели в дате.
      	 * Функция для фильтра date_i18n.
      	 *
      	 * @param строка $date       Дата в принятом формате
      	 * @param строка $req_format Формат передаваемой даты
      	 * @return Дату   в русском формате
      	 */
      	static function russify_months( $date, $req_format ){
      		// в формате есть "строковые" неделя или месяц. выходим, если в формате есть экранированные символы
      		if( false !== strpos( $req_format, '\\') || ! preg_match('/[FMlS]/', $req_format ) )
      			return $date;
      
      		$replace = array (
      			'Январь'=>'января', 'Февраль'=>'февраля', 'Март'=>'марта', 'Апрель'=>'апреля', 'Май'=>'мая', 'Июнь'=>'июня', 'Июль'=>'июля', 'Август'=>'августа', 'Сентябрь'=>'сентября', 'Октябрь'=>'октября', 'Ноябрь'=>'ноября', 'Декабрь'=>'декабря',
      
      			'Янв'=>'янв.', 'Фев'=>'фев.', 'Мар'=>'март', 'Апр'=>'апр.', 'Май'=>'май', 'Июн'=>'июнь', 'Июл'=>'июль', 'Авг'=>'авг.', 'Сен'=>'сен.', 'Окт'=>'окт.', 'Ноя'=>'ноя.', 'Дек'=>'дек.',
      
      			'January'=>'января', 'February'=>'февраля', 'March'=>'марта', 'April'=>'апреля', 'May'=>'мая', 'June'=>'июня', 'July'=>'июля', 'August'=>'августа', 'September'=>'сентября', 'October'=>'октября', 'November'=>'ноября', 'December'=>'декабря',
      
      			'Jan'=>'янв.', 'Feb'=>'фев.', 'Mar'=>'март.', 'Apr'=>'апр.', 'May'=>'мая', 'Jun'=>'июня', 'Jul'=>'июля', 'Aug'=>'авг.', 'Sep'=>'сен.', 'Oct'=>'окт.', 'Nov'=>'нояб.', 'Dec'=>'дек.',
      
      			'Sunday'=>'воскресенье', 'Monday'=>'понедельник', 'Tuesday'=>'вторник', 'Wednesday'=>'среда', 'Thursday'=>'четверг', 'Friday'=>'пятница', 'Saturday'=>'суббота',
      
      			'Sun'=>'вос.', 'Mon'=>'пон.', 'Tue'=>'вт.', 'Wed'=>'ср.', 'Thu'=>'чет.', 'Fri'=>'пят.', 'Sat'=>'суб.', 'th'=>'', 'st'=>'', 'nd'=>'', 'rd'=>'',
      		);
      		$date = strtr( $date, $replace );
      
      		return $date;
      	}
      
      	## склонение
      	static function plural( $number, $titles, $strip_num = false ){
      		$titles = explode('_', $titles );
      		$cases = array (2, 0, 1, 1, 1, 2);
      		return ( $strip_num ? '' : $number .' ' ). $titles[ ($number%100 > 4 && $number %100 < 20) ? 2 : $cases[min($number%10, 5)] ];
      	}
      
      	/*
      	function plural( $num, $forms, $strip_num = false ) {
      		$forms = explode('_', $forms );
      		return ( $strip_num ? '' : $num .' ' ) . ( $num % 10 === 1 && $num % 100 !== 11 ? $forms[0] : ($num % 10 >= 2 && $num % 10 <= 4 && ($num % 100 < 10 || $num % 100 >= 20) ? $forms[1] : $forms[2]) );
      	}
      	*/
      }
      
      • Андрей

        Отличный код! Но я хотел бы ограничить его до 2-х дней - сегодня и вчера. Т.е. если дата сегодня, то отбражать как в коде - секунд назад, минут назад, часов назад. Если дата больше суток, то отображать вчера в 10:14. Если дата старше 2-х дней, то отображать ту, что по умолчанию установлена в настройках wordpress.
        Подскажите, как модифицировать ваш код? Спасибо.

        Ответить3 месяца назад #
        • Kama6810

          // дни // месяцы // годы закомментируй и дополни return __('вчера','km');

          Как-то так:

          return date( __('вчера в H:m','km'), $i );
          Ответить3 месяца назад #
          • Андрей

            Спасибо за помощь, но когда я закомментировал дни, месяцы, годы, то у меня вообще перестала показываться дата, которая старше 2-х дней. Видимо, где-то я напортачил, потому как коде я полный ноль. Вот такой код я пытался использовать.

            Ответить3 месяца назад #
            • Kama6810

              Так попробуй:

                          elseif( $days_passed == 1 )
              				return __('вчера','km');
              			else
              				return $date;
              Ответить3 месяца назад #
Здравствуйте, !     Войти . Зарегистрироваться