wplang.ru wordpress WP Lang

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

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

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

Пошаговое решение: настройка динамических цен по языку

1. Определяем текущий язык

Для начала необходимо получить текущий язык сайта. В WPML это делается функцией icl_get_current_language(), в Polylang — pll_current_language().

function get_current_language_code() {
    if ( function_exists('icl_get_current_language') ) {
        return icl_get_current_language();
    } elseif ( function_exists('pll_current_language') ) {
        return pll_current_language();
    }
    return 'default';
}

2. Создаем фильтр для изменения цены товара

WooCommerce позволяет изменить цену через фильтр woocommerce_product_get_price. В нем можно подставить цену в зависимости от языка.

add_filter('woocommerce_product_get_price', 'custom_dynamic_price_by_language', 10, 2);
function custom_dynamic_price_by_language($price, $product) {
    $lang = get_current_language_code();

    // Пример динамического изменения цены
    switch ($lang) {
        case 'en':
            // Цена в долларах, например, конвертируем из рублей
            $price = $price / 70; // курс 70 рублей за доллар
            break;
        case 'ru':
            // Оставляем цену в рублях
            break;
        default:
            // Другие языки — без изменений
            break;
    }
    return round($price, 2);
}

3. Аналогично меняем цену для отображения в корзине и заказах

Чтобы цена корректно отображалась в корзине, используйте фильтры woocommerce_cart_item_price и woocommerce_cart_item_subtotal, а также для итогов заказов.

add_filter('woocommerce_cart_item_price', 'custom_cart_price_display', 10, 3);
function custom_cart_price_display($price_html, $cart_item, $cart_item_key) {
    $product = $cart_item['data'];
    $price = custom_dynamic_price_by_language($product->get_price(), $product);
    return wc_price($price);
}

add_filter('woocommerce_cart_item_subtotal', 'custom_cart_subtotal_display', 10, 3);
function custom_cart_subtotal_display($subtotal_html, $cart_item, $cart_item_key) {
    $product = $cart_item['data'];
    $qty = $cart_item['quantity'];
    $price = custom_dynamic_price_by_language($product->get_price(), $product);
    $subtotal = $price * $qty;
    return wc_price($subtotal);
}

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

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

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

  • Фильтры не срабатывают: проверьте, что код добавлен в файл functions.php активной темы или в кастомный плагин, и что нет конфликтов с другими плагинами.
  • Неправильное определение языка: используйте проверенные функции WPML или Polylang, не пытайтесь читать параметр URL напрямую.
  • Цена не округляется: всегда применяйте round() для чисел с плавающей точкой, WooCommerce работает с округленными значениями.
  • Проблемы с кешированием: если цены не меняются при смене языка, очистите кеш сайта и браузера.

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

  • Не используйте жёстко заданные курсы валют в коде, лучше получать их из API и кэшировать результат.
  • Добавляйте фильтры с приоритетом 10 или выше, чтобы не нарушать логику других плагинов.
  • Минимизируйте количество запросов к базе, не вызывайте get_post_meta внутри фильтров цен без необходимости.

Сравнение подходов для динамического изменения цены в WooCommerce по языку

МетодОписаниеПлюсыМинусы
Фильтры WooCommerce (как в статье) Изменение цены через хуки woocommerce_product_get_price и отображение в корзине Гибко, не требует изменения базы, работает с любым плагином языков Требует грамотной реализации, возможны конфликты с кешем
Отдельные товары под каждый язык Создание копий товаров с разными ценами для каждого языка Простота в админке, поддержка плагинов мультиязычности Дублирование товаров, сложность управления
Плагины валютного переключателя Использование плагинов, меняющих валюту по языку Автоматизировано, интеграция с курсами валют Может не поддерживать все языковые плагины, требует настройки
×
-15%
на премиум-тему
Bono

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

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