Диагностика проблемы: почему стандартные описания товаров не подходят для многоязычности
По умолчанию WooCommerce не поддерживает многоязычные описания товаров. Использование плагинов вроде WPML или Polylang часто увеличивает нагрузку и вызывает конфликты. Если нужно минимизировать установку плагинов, приходится создавать собственное решение.
Типичные симптомы проблемы:
- Описание товара отображается только на одном языке.
- Нет возможности легко переключать язык описания.
- Использование плагинов приводит к дублированию контента и усложнению админки.
Пошаговое решение: добавляем многоязычность описаний через кастомные поля и фильтры
1. Создаем кастомные поля для описаний на разные языки
Используем стандартные метаполя WooCommerce для хранения описаний на нескольких языках. Например, для двух языков — русский и английский:
add_action('woocommerce_product_options_general_product_data', function() {
woocommerce_wp_textarea_input([
'id' => '_description_ru',
'label' => __('Описание (русский)', 'woocommerce'),
'desc_tip' => true,
'description' => __('Введите описание товара на русском языке.', 'woocommerce'),
]);
woocommerce_wp_textarea_input([
'id' => '_description_en',
'label' => __('Description (English)', 'woocommerce'),
'desc_tip' => true,
'description' => __('Enter product description in English.', 'woocommerce'),
]);
});2. Сохраняем кастомные поля при сохранении товара
add_action('woocommerce_process_product_meta', function($post_id) {
if (isset($_POST['_description_ru'])) {
update_post_meta($post_id, '_description_ru', sanitize_textarea_field($_POST['_description_ru']));
}
if (isset($_POST['_description_en'])) {
update_post_meta($post_id, '_description_en', sanitize_textarea_field($_POST['_description_en']));
}
});3. Подключаем фильтр для вывода описания в зависимости от языка
Определяем текущий язык сайта и динамически выводим описание товара из нужного поля. Для упрощения возьмем, что язык определяется константой ICL_LANGUAGE_CODE (как в WPML), но можно заменить на свою логику.
add_filter('woocommerce_short_description', function($description) {
global $post;
$lang = defined('ICL_LANGUAGE_CODE') ? ICL_LANGUAGE_CODE : 'ru';
$meta_key = '_description_' . $lang;
$custom_desc = get_post_meta($post->ID, $meta_key, true);
return $custom_desc ? wpautop($custom_desc) : $description;
});
add_filter('the_content', function($content) {
if (is_product()) {
global $post;
$lang = defined('ICL_LANGUAGE_CODE') ? ICL_LANGUAGE_CODE : 'ru';
$meta_key = '_description_' . $lang;
$custom_desc = get_post_meta($post->ID, $meta_key, true);
return $custom_desc ? wpautop($custom_desc) : $content;
}
return $content;
});Проверка результата после внедрения
- Откройте страницу редактирования товара в админке WooCommerce. Убедитесь, что появились кастомные поля «Описание (русский)» и «Description (English)».
- Заполните описания в двух языках и сохраните товар.
- На фронтенде переключите язык сайта (через вашу систему определения языка или вручную установите константу
ICL_LANGUAGE_CODEвruилиen). Убедитесь, что отображается описание на выбранном языке.
Частые ошибки и как их исправить
- Кастомные поля не отображаются в админке. Проверьте, что хук
woocommerce_product_options_general_product_dataправильно подключен и что функция не конфликтует с другими. - Описание не меняется при смене языка. Убедитесь, что корректно работает определение текущего языка (замените
ICL_LANGUAGE_CODEна вашу логику). - Описание отображается без форматирования. Используйте
wpautop()при выводе, чтобы сохранить переносы строк. - Перекрытие с SEO-плагинами или кэшированием. Очистите кэш сайта и браузера, проверьте, что кэш не фиксирует старые версии описаний.
Практические советы по безопасности и производительности
- При сохранении данных используйте
sanitize_textarea_field()или другие функции очистки, чтобы избежать XSS-уязвимостей. - Не храните много языков в одном поле — лучше создавать отдельные метаполя для каждого языка для простоты и производительности.
- Если количество языков растет, подумайте о создании отдельной таблицы для переводов, чтобы не перегружать метаполя.
- Минимизируйте количество SQL-запросов, кешируя метаданные, если необходимо.
Сравнение вариантов реализации многоязычных описаний WooCommerce
| Метод | Преимущества | Недостатки | Пример |
|---|---|---|---|
| Плагины (WPML, Polylang) | Готовое решение, поддержка разных языков, интеграция с WooCommerce | Нагрузка, возможные конфликты, сложность | WPML + WooCommerce Multilingual |
| Кастомные поля + фильтры | Легковесно, контроль над кодом, гибкость | Требует ручной настройки, не подходит для большого числа языков | Код из статьи |
| Отдельные товары для каждого языка | Простое управление через стандартный функционал | Дублирование, сложность администрирования | Дубликаты товаров с разными языками |