Русское склонение месяца в дате 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;
}