WPML — один из самых популярных плагинов для создания многоязычных сайтов на WordPress. Он отлично справляется с переводом страниц, записей, таксономий и других элементов. Однако часто возникает задача не только перевести контент, но и передать или синхронизировать дополнительные данные между языковыми версиями. В этой статье разберём, как реализовать передачу пользовательских полей и метаданных между языками с помощью WPML, а также приведём примеры кода для автоматизации этого процесса.
Почему важно синхронизировать данные между языками
При создании многоязычного сайта с WPML каждая языковая версия записи или страницы — это отдельный пост в базе данных WordPress. Это означает, что дополнительные данные, например, пользовательские поля (custom fields), не копируются автоматически при создании перевода. Если на сайте используется кастомный функционал, который хранит важные настройки в метаданных, их нужно переносить вручную или программно.
Без синхронизации пользовательских полей перевод может быть неполным, и функционал связанный с этими данными перестанет работать корректно. Особенно это касается интернет-магазинов, каталогов, портфолио и любых других сайтов с расширенными кастомными данными.
WPML предоставляет базовые инструменты для синхронизации, но для сложных задач часто приходится писать собственный код.
Основные способы передачи пользовательских данных между языками
1. Использование встроенных функций WPML
WPML автоматически синхронизирует некоторые стандартные поля, но для пользовательских полей нужно настроить их в разделе "Настройки мультиязычности" — "Синхронизация пользовательских полей". Там можно указать, какие метаполя копировать при создании перевода.
Однако этот способ подходит, если поля одинаковы и не требуют преобразований.
2. Программное копирование метаданных при сохранении перевода
Чтобы автоматически копировать нужные пользовательские поля из оригинальной записи в перевод, можно использовать хук icl_make_duplicate или хук сохранения записи. Ниже пример функции для копирования метаданных:
function wp5_copy_custom_fields_wpml($post_id, $lang_code, $original_post_id) {
$custom_fields = ['_my_custom_field_1', '_my_custom_field_2']; // список полей для копирования
foreach ($custom_fields as $field) {
$value = get_post_meta($original_post_id, $field, true);
if ($value !== '') {
update_post_meta($post_id, $field, maybe_unserialize($value));
}
}
}
add_action('icl_make_duplicate', 'wp5_copy_custom_fields_wpml', 10, 3);
Эта функция сработает в момент дублирования записи WPML и скопирует указанные метаполя.
3. Синхронизация данных на лету через REST API WPML
Если сайт используется с внешними сервисами или интеграциями, полезно передавать и получать данные по API. WPML расширяет REST API WordPress, позволяя работать с переводами. Для передачи кастомных полей можно зарегистрировать собственные маршруты или расширить существующие.
Пример регистрации кастомного REST API маршрута для получения всех метаданных перевода:
add_action('rest_api_init', function () {
register_rest_route('wp5/v1', '/post-meta/(?P<id>\d+)', [
'methods' => 'GET',
'callback' => 'wp5_get_post_meta_for_translation',
'permission_callback' => function () {
return current_user_can('edit_posts');
},
]);
});
function wp5_get_post_meta_for_translation($request) {
$post_id = $request['id'];
$meta = get_post_meta($post_id);
return rest_ensure_response($meta);
}
Это позволяет получить метаданные для дальнейшей обработки и передачи между языками.
Пример: автоматическая синхронизация поля "цена" в интернет-магазине с WPML
Предположим, у вас есть поле _product_price, которое хранит цену товара. При создании перевода товара нужно, чтобы цена автоматически копировалась, чтобы не вводить её вручную.
Добавим такой код в functions.php вашей темы или в отдельный плагин:
function wp5_sync_product_price_wpml($post_id, $lang_code, $original_post_id) {
$price = get_post_meta($original_post_id, '_product_price', true);
if ($price !== '') {
update_post_meta($post_id, '_product_price', $price);
}
}
add_action('icl_make_duplicate', 'wp5_sync_product_price_wpml', 10, 3);
Теперь при создании перевода товара поле цены будет автоматически заполнено.
Как избежать ошибок при синхронизации данных в WPML
При работе с WPML и кастомными полями нужно учитывать следующие моменты:
- Проверяйте, что метаполя действительно существуют и имеют корректные значения перед копированием.
- Учитывайте типы данных: сериализованные массивы, числовые значения, строки — используйте
maybe_unserialize()и другие функции для корректной обработки. - Не копируйте поля, которые должны быть уникальными для каждой языковой версии (например, слаг или SEO метаданные), иначе это вызовет конфликты.
- Тестируйте на разных этапах создания и редактирования переводов, чтобы не потерять данные.
Полезные плагины для работы с WPML и кастомными полями
Для расширения возможностей WPML и упрощения работы с кастомными полями можно использовать дополнительные плагины:
- Clearfy Pro — оптимизация и управление функционалом WordPress, помогает управлять метаданными и совместимостью с WPML.
- WPRemark — расширенные комментарии с поддержкой мультиязычности.
- Expert Review — отзывы и оценки с многоязычной поддержкой.
Выводы и рекомендации
Синхронизация пользовательских данных между языками в WPML — частая, но не всегда тривиальная задача. Важно правильно настроить копирование нужных полей и, при необходимости, расширить функционал с помощью кода. Использование хука icl_make_duplicate — самый надёжный способ автоматизировать процесс. При сложных сценариях полезно задействовать REST API для интеграций.
Не забывайте тестировать изменения в рабочих условиях и не копировать избыточные данные, чтобы не создавать конфликты и не замедлять работу сайта.