wplang.ru wordpress WP Lang

WooCommerce: как создать многоязычные описания товаров без плагинов

Диагностика проблемы: почему стандартные описания товаров не подходят для многоязычности

По умолчанию 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
Кастомные поля + фильтрыЛегковесно, контроль над кодом, гибкостьТребует ручной настройки, не подходит для большого числа языковКод из статьи
Отдельные товары для каждого языкаПростое управление через стандартный функционалДублирование, сложность администрированияДубликаты товаров с разными языками
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »