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