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