wplang.ru wordpress WP Lang

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

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

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

Если вы просто меняете язык, а цена остаётся одинаковой, значит, не настроена динамическая подмена цены на уровне PHP или JavaScript, или не настроены валюты и курсы.

Диагностика: как понять, что цена не меняется динамически

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

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

1. Настройка валюты для каждого языка (если используется WPML)

WPML позволяет привязать валюту к языку. Зайдите в WooCommerce > WooCommerce Multilingual > Multi-currency и добавьте валюты, установите курсы обмена. Активируйте опцию «Включить мультивалютность».

2. Перехват цены товара через фильтр woocommerce_get_price

Если валюты не подходят или нужен более тонкий контроль, можно использовать фильтр для смены цены в зависимости от языка:

add_filter('woocommerce_get_price', 'change_price_by_language', 10, 2);
function change_price_by_language($price, $product) {
    $current_lang = apply_filters('wpml_current_language', null); // для WPML
    if (!$current_lang) {
        $current_lang = pll_current_language(); // для Polylang
    }

    if ($current_lang === 'en') {
        // Пример конвертации с рубля в доллар по фиксированному курсу
        $price = $price / 75;
    } elseif ($current_lang === 'ru') {
        // Оставляем цену как есть
    }
    return $price;
}

3. Обновление отображения валюты в шаблонах

Чтобы символ валюты соответствовал языку, можно отфильтровать вывод цены:

add_filter('woocommerce_currency_symbol', 'change_currency_symbol_by_language', 10, 2);
function change_currency_symbol_by_language($currency_symbol, $currency) {
    $current_lang = apply_filters('wpml_current_language', null);
    if ($current_lang === 'en') {
        return '$';
    } elseif ($current_lang === 'ru') {
        return '₽';
    }
    return $currency_symbol;
}

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

  1. Переключитесь на русский язык — убедитесь, что цена отображается в рублях.
  2. Переключитесь на английский — цена должна пересчитаться и отображаться в долларах.
  3. Проверьте страницу товара, каталог, корзину и страницу оформления заказа.
  4. Тестируйте с разными товарами — цена должна изменяться корректно.

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

  • Фильтр не срабатывает: Проверьте, что код подключён в functions.php или в плагине, и что нет конфликтов с другими фильтрами.
  • Цена меняется, но символ валюты не меняется: Добавьте фильтр woocommerce_currency_symbol, как показано выше.
  • Неверный язык в функции: Убедитесь, что правильно используете API мультиязычного плагина (wpml_current_language или pll_current_language).
  • Кэширование не обновляет цены: Отключите кэширование страниц или настройте исключения для страниц WooCommerce.

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

  • Не делайте запросы к внешним API для конвертации курсов в реальном времени внутри фильтров цены — это замедлит загрузку страницы.
  • Для динамической конвертации используйте планировщик WP-Cron для обновления курсов и сохраняйте их в опциях.
  • Используйте nonce и проверяйте права пользователя при добавлении кастомных функций, если они принимают параметры из запроса.
  • Проверяйте совместимость с кэш-плагинами (например, Clearfy Pro от WPShop может помочь настроить исключения).

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

СпособПреимуществаНедостатки
Мультивалютность WPMLГотовое решение с курсами и переключением валютПлатный плагин, ограничена кастомизация
Фильтр woocommerce_get_priceГибкий, можно реализовать любую логикуТребует знаний PHP, нужно управлять курсами самостоятельно
JavaScript-переключение ценыНе требует серверных измененийМенее надёжно, цена в корзине и на сервере не меняется
×
-15%
на премиум-тему
Bono

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

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