Русское склонение месяца в дате WordPress

Хук ниже переводит название месяца с английского на русский в дате WordPress, исправляет склонение названий месяцев в датах WordPress и пишет месяц с маленькой буквы (переводит в нижний регистр).

Вариант 1: Правильное склонение

Например, мы опубликовали статью и выводим дату так:

echo get_the_date( 'j M Y' ); // 14 Май 2020

И дата в ней выглядит так 14 Апр 2020, хотя куда более по-русски было бы 14 апр. 2020.

Следующий код это поправит:

add_action( 'after_setup_theme', 'fix_month_abbrev', 0 );
function fix_month_abbrev(){
	global $wp_locale;

	$wp_locale->month_abbrev = [
		'Январь'    => 'янв.',
		'Февраль'   => 'фев.',
		'Март'      => 'мар.',
		'Апрель'    => 'апр.',
		'Май'       => 'май',
		'Июнь'      => 'июнь',
		'Июль'      => 'июль',
		'Август'    => 'авг.',
		'Сентябрь'  => 'сен.',
		'Октябрь'   => 'окт.',
		'Ноябрь'    => 'ноя.',
		'Декабрь'   => 'дек.',

	] + $wp_locale->month_abbrev;
}

Остальные варианты даты выводятся правильно в WP из коробки.

Вариант 2: Правильное склонение

С версии ВП 4.4 - этот код не актуален, потому что WP научился склонять полные названия месяцев, из коробки. Проблема остается только с сокращенным названием, например: апр. мар. (см. выше).

Например, мы опубликовали статью и выводим дату так:

echo get_the_date( 'j F Y' ); // 14 Май 2020

И дата в ней выглядит так 14 Май 2020, хотя куда более по-русски было бы 14 мая 2020.

Следующий код это поправит:

add_action( 'wp_loaded', function(){

	$is_new = version_compare( $GLOBALS['wp_version'], '5.3.0', '>=' );

	if( $is_new )  add_filter( 'wp_date', 'russify_months', 11, 2 );   // WP 5.3
	else           add_filter( 'date_i18n', 'russify_months', 11, 2 ); // WP < 5.3

} );

/**
 * Русифицирует месяца и недели в дате.
 * Функция для фильтра date_i18n.
 *
 * @param string $date       Дата в принятом формате.
 * @param string $req_format Формат передаваемой даты.
 *
 * @return string Дату в русском формате.
 */
function russify_months( $date, $req_format ){

	// в формате есть "строковые" неделя или месяц. выходим, если в формате есть экранированные символы
	if( false !== strpos( $req_format, '\\') || ! preg_match('/[FMlS]/', $req_format ) || determine_locale() !== 'ru_RU'  )
		return $date;

	$date = strtr( $date, [
		'Январь'=>'января', 'Февраль'=>'февраля', 'Март'=>'марта', 'Апрель'=>'апреля', 'Май'=>'мая', 'Июнь'=>'июня', 'Июль'=>'июля', 'Август'=>'августа', 'Сентябрь'=>'сентября', 'Октябрь'=>'октября', 'Ноябрь'=>'ноября', 'Декабрь'=>'декабря',

		'Янв'=>'янв.', 'Фев'=>'фев.', 'Мар'=>'март', 'Апр'=>'апр.', 'Июн'=>'июнь', 'Июл'=>'июль', 'Авг'=>'авг.', 'Сен'=>'сен.', 'Окт'=>'окт.', 'Ноя'=>'ноя.', 'Дек'=>'дек.',

		'January'=>'января', 'February'=>'февраля', 'March'=>'марта', 'April'=>'апреля', 'May'=>'мая', 'June'=>'июня', 'July'=>'июля', 'August'=>'августа', 'September'=>'сентября', 'October'=>'октября', 'November'=>'ноября', 'December'=>'декабря',

		'Jan'=>'янв.', 'Feb'=>'фев.', 'Mar'=>'март.', 'Apr'=>'апр.', '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 $date;
}
1 комментарий
    Войти