Как использовать Polylang для автоперевода товаров WooCommerce

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

Polylang — популярный плагин для создания многоязычных сайтов на WordPress, включая WooCommerce. Однако по умолчанию он не предоставляет функцию автоперевода описаний и атрибутов товаров. При добавлении нового товара на основном языке его перевод на другие языки нужно создавать вручную, что занимает много времени и усложняет процесс ведения каталога.

Типичные симптомы:
— отсутствуют переводы товаров после установки Polylang;
— нет автоматического копирования содержимого товара;
— необходимость переключаться между языками и вводить данные вручную.

Пошаговое решение: автоматический перевод описаний товаров WooCommerce с Polylang

1. Подключение API автоперевода (например, DeepL или Google Translate)

Для автоперевода понадобится внешний API. Рекомендуется использовать DeepL API из-за качества перевода, но Google Translate также подходит.

function translate_text_via_api($text, $target_lang) {
    $api_key = 'ВАШ_КЛЮЧ_DEEPL';
    $url = 'https://api-free.deepl.com/v2/translate';
    $response = wp_remote_post($url, [
        'body' => [
            'auth_key' => $api_key,
            'text' => $text,
            'target_lang' => strtoupper($target_lang),
        ]
    ]);
    if (is_wp_error($response)) {
        return false;
    }
    $body = json_decode(wp_remote_retrieve_body($response), true);
    return $body['translations'][0]['text'] ?? false;
}

2. Хук для автоперевода при сохранении товара

Добавим функцию, которая при сохранении товара на основном языке автоматически создаст перевод описания и атрибутов на другие языки, зарегистрированные в Polylang.

add_action('save_post_product', 'auto_translate_woocommerce_product', 20, 3);
function auto_translate_woocommerce_product($post_id, $post, $update) {
    // Проверяем, что это основной язык
    $default_lang = pll_default_language();
    $current_lang = pll_get_post_language($post_id);
    if ($current_lang !== $default_lang) {
        return;
    }

    // Получаем все языки, кроме основного
    $languages = pll_languages_list(['exclude' => [$default_lang]]);

    // Получаем данные товара
    $product = wc_get_product($post_id);
    if (!$product) {
        return;
    }

    // Переводим и сохраняем для каждого языка
    foreach ($languages as $lang) {
        $translated_post_id = pll_get_post($post_id, $lang);

        // Если перевод еще не создан, создаем новый пост
        if (!$translated_post_id) {
            $translated_post_id = wp_insert_post([
                'post_type' => 'product',
                'post_status' => 'publish',
                'post_title' => '',
                'post_content' => '',
                'post_excerpt' => '',
            ]);
            pll_set_post_language($translated_post_id, $lang);
            pll_save_post_translations([
                $default_lang => $post_id,
                $lang => $translated_post_id
            ]);
        }

        // Переводим заголовок, описание и короткое описание
        $translated_title = translate_text_via_api($post->post_title, $lang);
        $translated_content = translate_text_via_api($post->post_content, $lang);
        $translated_excerpt = translate_text_via_api($post->post_excerpt, $lang);

        // Обновляем перевод
        wp_update_post([
            'ID' => $translated_post_id,
            'post_title' => $translated_title ?: $post->post_title,
            'post_content' => $translated_content ?: $post->post_content,
            'post_excerpt' => $translated_excerpt ?: $post->post_excerpt,
        ]);

        // Переводим атрибуты
        $translated_product = wc_get_product($translated_post_id);
        $attributes = $product->get_attributes();
        foreach ($attributes as $attr_name => $attr) {
            if ($attr->is_taxonomy()) {
                $terms = wp_get_post_terms($post_id, $attr_name);
                $translated_terms_ids = [];
                foreach ($terms as $term) {
                    $translated_term_id = pll_get_term($term->term_id, $lang);
                    if (!$translated_term_id) {
                        // Можно добавить создание перевода термина здесь
                        continue;
                    }
                    $translated_terms_ids[] = intval($translated_term_id);
                }
                wp_set_post_terms($translated_post_id, $translated_terms_ids, $attr_name);
            } else {
                $translated_value = translate_text_via_api($attr->get_options()[0] ?? '', $lang);
                $translated_product->set_attribute($attr_name, $translated_value ?: $attr->get_options()[0]);
            }
        }
        $translated_product->save();
    }
}

Проверка результата после внедрения

  • Создайте или обновите товар на основном языке.
  • Перейдите в панель редактирования перевода товара на другой язык.
  • Проверьте, что поля «Название», «Описание», «Краткое описание» и атрибуты заполнены автоматически с переводом.
  • Проверьте на фронтенде, что переключение языков корректно отображает переведённый товар.

Частые ошибки и как исправить

  • Отсутствие ключа API или неверный ключ: В ответе функции translate_text_via_api возвращается false. Проверяйте правильность ключа и лимиты API.
  • Переводы терминов не создаются автоматически: Polylang не создает переводы таксономий по умолчанию. Для автоматического перевода терминов нужно реализовать отдельный функционал или перевести их вручную.
  • Неправильная связь переводов товаров: Убедитесь, что pll_save_post_translations вызывается корректно с правильными ID постов и языками.
  • Дублирование товаров: Проверяйте, что не создаете новые товары при каждом сохранении, а обновляете существующие переводы.

Практические советы по безопасности и производительности

  • Кэширование перевода: Чтобы избежать частых запросов к API, сохраняйте переводы в метаполях товара и обновляйте их только при изменении контента.
  • Ограничение вызовов API: Добавьте проверку на частоту вызовов, чтобы не превысить лимиты и не заблокировать ключ.
  • Обработка ошибок API: Логируйте ошибки и уведомляйте администраторов сайта для быстрой реакции.
  • Безопасное хранение ключей API: Храните ключи в файле wp-config.php или используйте переменные окружения, не в коде плагина.

Сравнение вариантов реализации автоперевода товаров WooCommerce

ВариантПреимуществаНедостаткиКому подходит
Полностью вручную с PolylangПолный контроль над переводом, без доп. затратОчень трудоемко, не подходит для больших каталоговМаленькие магазины с ограниченным ассортиментом
Автоперевод с кастомным кодом и API DeepL/GoogleАвтоматизация, экономия времени, гибкость настройкиТребует разработки, оплату API, возможны ошибки переводаСредние и крупные магазины, желающие сэкономить время
Коммерческие плагины автоперевода (WPML + автоматизация)Готовое решение, поддержка и обновленияСтоимость лицензии, ограниченная кастомизацияКрупные проекты, где важна поддержка и стабильность
Как сделать автоперевод контента WordPress на основе open source решений
23.01.2026
Как правильно перевести статусы заказов WooCommerce в WordPress
31.05.2026
Как автоматически переводить контент WordPress с помощью API DeepL
25.03.2026
Как автоматизировать перевод динамического контента WordPress с помощью хуков и AJAX
17.04.2026
Как сделать перевод административной панели WordPress на русский язык
06.01.2026