wp_maybe_decline_date()WP 4.4.0

Склоняет или изменяет месяц в переданной строке даты. Например для русского: 15 Май > 15 мая.

Работает только для языков, в которых месяца в дате изменяются (склоняются). Склоняется месяц в дате или нет, определяется следующей строкой перевода:

'on' === _x( 'off', 'decline months names: on or off' )

Функция проверяет переданную дату и если она формата: число слово ... (15 Май, 15 май 2019 год), то дата будет обработана, и в ней название месяца будет заменено на название в родительском падеже. Так, например, 15 Май 2019 превратиться в 15 мая 2019.

Функция ничего не делает (возвращает переданную дату), если месяца в языке не изменяются (не склоняются).

По умолчанию в WP функция повешена на хук date_i18n:

add_filter( 'date_i18n', 'wp_maybe_decline_date' );

Функция обращается к глобальной переменной $wp_locale, содержащей объект класса WP_Locale, у которого есть свойства: month и month_genitive. Она делает преобразования на базе этих свойств (без учета регистра букв):

[month] => Array (
	[01] => Январь
	[02] => Февраль
	[03] => Март
	[04] => Апрель
	[05] => Май
	[06] => Июнь
	[07] => Июль
	[08] => Август
	[09] => Сентябрь
	[10] => Октябрь
	[11] => Ноябрь
	[12] => Декабрь
)

[month_genitive] => Array (
	[01] => января
	[02] => февраля
	[03] => марта
	[04] => апреля
	[05] => мая
	[06] => июня
	[07] => июля
	[08] => августа
	[09] => сентября
	[10] => октября
	[11] => ноября
	[12] => декабря
)
Работает на основе: WP_Locale()
1 раз — 0.000227 сек (быстро) | 50000 раз — 0.51 сек (очень быстро) | PHP 7.2.16, WP 5.2

Хуков нет.

Возвращает

Строку. Измененную даты, если язык сайта подразумевает склонения даты и переданную дату (без изменений) в противном случае.

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

wp_maybe_decline_date( $date );
$date(строка) (обязательный)
Отформатированное время.

Примеры

0

#1 Примеры конвертации даты

Дата имеет подходящий формат и преобразуется (изменяется, склоняется):

echo wp_maybe_decline_date( '15 Май 2019' ); //> 15 мая 2019

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

echo wp_maybe_decline_date( '15 Мая 2019' ); //> 15 Мая 2019
echo wp_maybe_decline_date( '15 мая 2019' ); //> 15 мая 2019

Дата имеет неподходящий формат, функция просто её возвращает без каких либо попыток что-то изменить.

echo wp_maybe_decline_date( 'Май 2019 года' ); //> Май 2019 года

Заметки

  • Global. WP_Locale. $wp_locale WordPress date and time locale object.

Список изменений

С версии 4.4.0 Введена.
С версии 5.4.0 The $format parameter was added.

Код wp_maybe_decline_date() WP 6.7.1

function wp_maybe_decline_date( $date, $format = '' ) {
	global $wp_locale;

	// i18n functions are not available in SHORTINIT mode.
	if ( ! function_exists( '_x' ) ) {
		return $date;
	}

	/*
	 * translators: If months in your language require a genitive case,
	 * translate this to 'on'. Do not translate into your own language.
	 */
	if ( 'on' === _x( 'off', 'decline months names: on or off' ) ) {

		$months          = $wp_locale->month;
		$months_genitive = $wp_locale->month_genitive;

		/*
		 * Match a format like 'j F Y' or 'j. F' (day of the month, followed by month name)
		 * and decline the month.
		 */
		if ( $format ) {
			$decline = preg_match( '#[dj]\.? F#', $format );
		} else {
			// If the format is not passed, try to guess it from the date string.
			$decline = preg_match( '#\b\d{1,2}\.? [^\d ]+\b#u', $date );
		}

		if ( $decline ) {
			foreach ( $months as $key => $month ) {
				$months[ $key ] = '# ' . preg_quote( $month, '#' ) . '\b#u';
			}

			foreach ( $months_genitive as $key => $month ) {
				$months_genitive[ $key ] = ' ' . $month;
			}

			$date = preg_replace( $months, $months_genitive, $date );
		}

		/*
		 * Match a format like 'F jS' or 'F j' (month name, followed by day with an optional ordinal suffix)
		 * and change it to declined 'j F'.
		 */
		if ( $format ) {
			$decline = preg_match( '#F [dj]#', $format );
		} else {
			// If the format is not passed, try to guess it from the date string.
			$decline = preg_match( '#\b[^\d ]+ \d{1,2}(st|nd|rd|th)?\b#u', trim( $date ) );
		}

		if ( $decline ) {
			foreach ( $months as $key => $month ) {
				$months[ $key ] = '#\b' . preg_quote( $month, '#' ) . ' (\d{1,2})(st|nd|rd|th)?([-–]\d{1,2})?(st|nd|rd|th)?\b#u';
			}

			foreach ( $months_genitive as $key => $month ) {
				$months_genitive[ $key ] = '$1$3 ' . $month;
			}

			$date = preg_replace( $months, $months_genitive, $date );
		}
	}

	// Used for locale-specific rules.
	$locale = get_locale();

	if ( 'ca' === $locale ) {
		// " de abril| de agost| de octubre..." -> " d'abril| d'agost| d'octubre..."
		$date = preg_replace( '# de ([ao])#i', " d'\\1", $date );
	}

	return $date;
}