Почему важно переводить типы записей и таксономии в WordPress
Большинство мульти-язычных сайтов на WordPress сталкиваются с проблемой перевода не только стандартных страниц и записей, но и пользовательских типов записей (Custom Post Types, CPT) и таксономий. Это критично, если ваш сайт содержит сложный контент, который не укладывается в стандартные категории и записи WordPress. Без правильного перевода CPT и таксономий посетители из разных языковых регионов не смогут полноценно взаимодействовать с контентом, а SEO пострадает.
Например, если вы создали CPT «Отзывы» и таксономию «Тип отзыва», они должны быть доступны и переведены для каждого языка. В этой статье мы рассмотрим, как это сделать как с помощью популярных плагинов, так и используя код.
Перевод пользовательских типов записей с помощью плагинов
Плагин WPML — работа с CPT и таксономиями
WPML — один из самых мощных и популярных плагинов для мультиязычности. Он отлично справляется с переводом кастомных типов записей и таксономий.
Чтобы перевести CPT и таксономии в WPML:
- Перейдите в
WPML > Настройки. - В разделе «Типы записей» выберите, какие CPT должны быть переводимыми.
- В разделе «Таксономии» отметьте таксономии, которые нужно перевести.
- После этого в интерфейсе администратора для каждого CPT и таксономии появится возможность создавать переводы.
WPML также автоматически синхронизирует поля и термины таксономий между языками, что существенно облегчает работу.
Polylang и перевод кастомных типов записей
Polylang поддерживает перевод CPT и таксономий, но необходимо зарегистрировать их с нужными параметрами, чтобы плагин корректно распознавал их.
Например, при регистрации CPT убедитесь, что параметр show_in_rest установлен в true для поддержки редактора Gutenberg и REST API, а public и publicly_queryable — тоже включены.
После регистрации CPT и таксономий в настройках Polylang можно назначить им переводимые языки и перевести контент.
Самостоятельный перевод CPT и таксономий через код
Регистрация CPT с поддержкой мультиязычности
Для корректного перевода CPT необходимо грамотно зарегистрировать их с помощью функции register_post_type. Вот пример регистрации CPT с префиксом wptranslate_ для функций, чтобы избежать конфликтов:
function wptranslate_register_custom_post_type() {
$labels = array(
'name' => __('Отзывы', 'wptranslate'),
'singular_name' => __('Отзыв', 'wptranslate'),
'add_new' => __('Добавить отзыв', 'wptranslate'),
'add_new_item' => __('Добавить новый отзыв', 'wptranslate'),
'edit_item' => __('Редактировать отзыв', 'wptranslate'),
'new_item' => __('Новый отзыв', 'wptranslate'),
'view_item' => __('Просмотреть отзыв', 'wptranslate'),
'search_items' => __('Искать отзывы', 'wptranslate'),
'not_found' => __('Отзывы не найдены', 'wptranslate'),
'not_found_in_trash' => __('Отзывы не найдены в корзине', 'wptranslate'),
);
$args = array(
'labels' => $labels,
'public' => true,
'show_in_rest' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'otzyvy'),
'supports' => array('title', 'editor', 'thumbnail'),
'show_in_menu' => true,
);
register_post_type('wptranslate_otzyvy', $args);
}
add_action('init', 'wptranslate_register_custom_post_type');Обратите внимание на использование функции __() для всех строк с текстом, чтобы сделать их доступными для перевода в .po/.mo файлах.
Регистрация таксономии с поддержкой перевода
Аналогично регистрируем таксономию для CPT. Например, «Тип отзыва»:
function wptranslate_register_custom_taxonomy() {
$labels = array(
'name' => __('Типы отзывов', 'wptranslate'),
'singular_name' => __('Тип отзыва', 'wptranslate'),
'search_items' => __('Искать типы отзывов', 'wptranslate'),
'all_items' => __('Все типы', 'wptranslate'),
'edit_item' => __('Редактировать тип', 'wptranslate'),
'add_new_item' => __('Добавить новый тип', 'wptranslate'),
'new_item_name' => __('Название нового типа', 'wptranslate'),
'menu_name' => __('Типы отзывов', 'wptranslate'),
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array('slug' => 'tip-otzyva'),
'show_in_rest' => true,
);
register_taxonomy('wptranslate_tip_otzyva', array('wptranslate_otzyvy'), $args);
}
add_action('init', 'wptranslate_register_custom_taxonomy');Важно, что строки интерфейса и ярлыков также обернуты в __(), что позволяет переводить их через Poedit или другие инструменты.
Создание и подключение файлов перевода (.po/.mo)
Чтобы перевести CPT и таксономии, нужно создать файлы локализации. Для этого:
- Экспортируйте шаблон перевода .pot с помощью плагина Loco Translate или Poedit, сканируя PHP-файлы вашей темы/плагина.
- Создайте переводы для нужных языков, например
wptranslate-ru_RU.poиwptranslate-ru_RU.mo. - Загрузите эти файлы в папку
/wp-content/languages/plugins/или/wp-content/languages/themes/, либо рядом с вашим плагином или темой.
WordPress автоматически подхватит переводы при переключении языка сайта.
Тонкости и проблемы при переводе CPT и таксономий
Переадресация и пермалинки
После регистрации CPT и таксономий с поддержкой перевода важно обновить настройки постоянных ссылок: зайдите в Настройки > Постоянные ссылки и просто нажмите «Сохранить изменения». Это обновит правила rewrite и позволит корректно работать URL на всех языках.
Если вы используете плагины мультиязычности, убедитесь, что для каждого языка правила rewrite правильно настроены, иначе при переключении языка могут возникать 404 ошибки.
Синхронизация таксономий между языками
Некоторые плагины, такие как WPML, умеют синхронизировать термины таксономий между языками. Это значит, что если вы создали термин «Положительный» на русском, можете создать его перевод на английский и связать эти термины, чтобы пользователь видел понятные категории на своем языке.
При самостоятельной реализации нужно хранить связи терминов, например, через мета-поля, но это сложнее и требует дополнительного программирования.
Перевод метаполей и пользовательских полей
Часто CPT содержат пользовательские поля (метаполя), которые тоже требуют перевода. Популярные плагины, например ACF (Advanced Custom Fields), имеют интеграцию с WPML и Polylang, что позволяет переводить значения полей.
При самостоятельной реализации вы можете создавать отдельные поля для каждого языка или хранить переводы в массиве. Также можно написать функции, которые возвращают значение поля в зависимости от текущего языка. Пример такой функции:
function wptranslate_get_custom_field_translation($post_id, $field_base_name) {
$lang = determine_locale(); // возвращает текущий язык, например 'ru_RU'
$field_name = $field_base_name . '_' . $lang;
$value = get_post_meta($post_id, $field_name, true);
if (!$value) {
$value = get_post_meta($post_id, $field_base_name . '_ru_RU', true); // fallback
}
return $value;
}Заключение: что использовать для перевода CPT и таксономий
Если вы не хотите писать много кода, лучше использовать WPML или Polylang, которые обеспечивают удобный интерфейс перевода и автоматическую синхронизацию.
Если же вы создаёте собственные решения, уделите внимание правильной регистрации CPT/таксономий с функциями локализации, созданию .po/.mo файлов и обновлению правил пермалинков.
Обязательно тестируйте работу сайта на нескольких языках и проверяйте, что все элементы интерфейса, включая заголовки, метаданные и термины, корректно переводятся и отображаются.