Диагностика проблемы с валютами в мультиязычном 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, не автоматическая конвертация курсов | Подходит для небольших проектов с фиксированными курсами |
| Отдельные магазины на каждом языке | Максимальная независимость, простота | Управление сложное, дублирование данных | Использовать только при больших различиях между языками |