wplang.ru wordpress WP Lang

WooCommerce: правильное отображение разных валют при мультиязычности

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

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

Типичные симптомы

  • Валюты не меняются при переключении языка;
  • В чекауте и корзине отображается неверная валюта;
  • Цены конвертируются неправильно или не конвертируются;
  • Проблемы с SEO из-за одинакового URL и цен с разной валютой.

Почему WooCommerce не меняет валюту автоматически?

WooCommerce хранит цены в базе в одной валюте (установленной в настройках). Для смены валюты нужна либо интеграция с плагином мультивалютности, либо ручная реализация конвертации и вывода цен. Некоторые мульти-язычные плагины, например WPML, предлагают совместимые решения, но при их отсутствии или кастомных разработках проблема остается.

Пошаговое решение: как реализовать отображение разных валют для разных языков

Ниже показано, как сделать переключение валют в WooCommerce в зависимости от текущего языка сайта на примере плагина Polylang. Аналогично можно адаптировать под WPML или другие.

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

function get_current_language() {
    if ( function_exists('pll_current_language') ) {
        return pll_current_language();
    }
    return 'ru'; // Язык по умолчанию
}

2. Устанавливаем валюту в зависимости от языка

add_filter('woocommerce_currency', 'set_currency_by_language');
function set_currency_by_language($currency) {
    $lang = get_current_language();
    switch ($lang) {
        case 'ru':
            return 'RUB';
        case 'en':
            return 'USD';
        case 'de':
            return 'EUR';
        default:
            return $currency; // Возвращаем валюту по умолчанию
    }
}

3. Конвертация цены (если цены хранятся в одной валюте)

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

add_filter('woocommerce_product_get_price', 'convert_price_by_language', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'convert_price_by_language', 10, 2);
add_filter('woocommerce_product_get_sale_price', 'convert_price_by_language', 10, 2);

function convert_price_by_language($price, $product) {
    $lang = get_current_language();
    $rates = [
        'ru' => 1,
        'en' => 0.013, // пример курса RUB -> USD
        'de' => 0.012, // пример курса RUB -> EUR
    ];
    if (isset($rates[$lang])) {
        return $price * $rates[$lang];
    }
    return $price;
}

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

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

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

  • Не меняется валюта при переключении языка. Проверьте, подключен ли плагин языков и корректно ли работает функция получения текущего языка (например, pll_current_language() для Polylang).
  • Цены не конвертируются. Убедитесь, что фильтры на получение цены применяются и курс валют актуален.
  • В корзине и на страницах заказа валюта отличается от выбранной. Проверьте, что фильтр woocommerce_currency работает на всех этапах загрузки страниц и не переопределяется другими плагинами.
  • Проблемы с кешированием. Если используете кеш (например, плагин кеширования или CDN), настройте исключения по языковым URL, чтобы не кэшировались страницы с разной валютой одинаково.

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

  • Не храните курсы валют в коде — используйте API валютных сервисов (например, exchangerate-api.com) и кешируйте данные, чтобы не делать лишних запросов.
  • Обрабатывайте фильтры на получение цены с минимальной нагрузкой, избегайте тяжелых операций в циклах.
  • Отключайте кеширование страниц с динамической валютой либо используйте разные кеш-ключи для разных языков и валют.
  • Используйте транзакционные валюты WooCommerce, чтобы не ломать совместимость с платежными шлюзами.

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

МетодПлюсыМинусыКомпромисс
Плагин мультиязычности + мультвалютности (WPML + WooCommerce Multilingual) Полная интеграция, официальная поддержка, автоматическая конвертация Платно, сложнее в настройке, нагрузка выше Лучший вариант для сложных проектов
Ручная смена валюты через фильтры (как в статье) Бесплатно, гибко, контролируемо Нужны знания PHP, не автоматическая конвертация курсов Подходит для небольших проектов с фиксированными курсами
Отдельные магазины на каждом языке Максимальная независимость, простота Управление сложное, дублирование данных Использовать только при больших различиях между языками
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙