Проблема: почему цены не меняются при переключении языка в 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;
}Проверка результата после внедрения
- Переключитесь на русский язык — убедитесь, что цена отображается в рублях.
- Переключитесь на английский — цена должна пересчитаться и отображаться в долларах.
- Проверьте страницу товара, каталог, корзину и страницу оформления заказа.
- Тестируйте с разными товарами — цена должна изменяться корректно.
Частые ошибки и как исправить
- Фильтр не срабатывает: Проверьте, что код подключён в 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-переключение цены | Не требует серверных изменений | Менее надёжно, цена в корзине и на сервере не меняется |