Диагностика проблемы: почему цена не меняется при смене языка
В WooCommerce на многоязычных сайтах часто возникает задача показывать разные цены товаров в зависимости от выбранного языка. По умолчанию WooCommerce этого не поддерживает – цена хранится в одном месте и не зависит от языка. Это приводит к тому, что при переключении языка цена остается одинаковой, что может вводить пользователя в заблуждение и снижать конверсию.
Чтобы проверить, есть ли у вас эта проблема, переключитесь на другой язык и посмотрите цену товара. Если она не меняется, значит функционал динамического изменения стоимости не реализован.
Пошаговое решение: добавляем динамическую цену по языку через код
1. Используем хук woocommerce_product_get_price
Для изменения цены на лету при выводе товара в WooCommerce можно использовать фильтр woocommerce_product_get_price. Он позволяет подменить цену товара перед отображением.
2. Определяем текущий язык
Если вы используете популярные плагины для мультиязычности (например, WPML или Polylang), нужно получить текущий язык сайта. Пример для Polylang:
function get_current_language_code() {
if ( function_exists('pll_current_language') ) {
return pll_current_language();
}
return 'default'; // язык по умолчанию
}3. Добавляем массив с ценами по языкам
Создаем массив, где ключ — код языка, а значение — нужная цена, например:
$prices_by_language = [
'ru' => 1000, // цена для русского
'en' => 30, // цена для английского
'de' => 28 // цена для немецкого
];4. Подключаем фильтр для замены цены
add_filter('woocommerce_product_get_price', 'change_price_by_language', 10, 2);
function change_price_by_language($price, $product) {
$lang = get_current_language_code();
$prices_by_language = [
'ru' => 1000,
'en' => 30,
'de' => 28
];
if ( isset($prices_by_language[$lang]) ) {
return $prices_by_language[$lang];
}
return $price;
}Такой код заменит цену на сайте согласно текущему языку.
Проверка результата после внедрения
- Переключитесь на каждый из языков на сайте.
- Откройте страницу товара и убедитесь, что цена меняется согласно заданному массиву.
- Проверьте корзину и оплату: цены должны обновляться и там тоже.
Для проверки корректности можно использовать инструменты разработчика браузера и убедиться, что цена в HTML соответствует ожидаемой.
Частые ошибки и как их исправить
- Цена не меняется: возможно, вы забыли добавить фильтр или неправильно определили текущий язык. Проверьте корректность функции получения языка.
- Цена меняется только на страницах товара, но не в корзине: в этом случае нужно добавить аналогичный фильтр для
woocommerce_product_get_price_in_cartиwoocommerce_cart_item_price. - Конфликт с кешированием: если на сайте включено кеширование, цены могут не обновляться сразу. Очистите кеш и проверьте снова.
- Проблемы с валютами: если на сайте используется мультивалютность, может потребоваться дополнительно синхронизировать цены с валютами.
Практические советы для расширения и безопасности
- Храните цены по языкам не в коде, а в настройках темы или отдельной таблице, чтобы было проще управлять.
- Для WooCommerce с большим количеством товаров и языков лучше использовать специализированные плагины, чтобы избежать ошибок.
- Всегда проверяйте, что цена возвращается в формате строки с десятичной точкой, например
'30.00'. - Для повышения производительности кешируйте результаты определения цены, если вычисления сложные.
- Убедитесь, что фильтры применяются с правильным приоритетом, чтобы избежать конфликтов с другими плагинами.
Дополнительный код для корректного отображения цены в корзине и чекауте
add_filter('woocommerce_product_get_price_in_cart', 'change_price_by_language_in_cart', 10, 2);
function change_price_by_language_in_cart($price, $product) {
return change_price_by_language($price, $product);
}
add_filter('woocommerce_cart_item_price', 'change_price_display_in_cart', 10, 3);
function change_price_display_in_cart($price_html, $cart_item, $cart_item_key) {
$product = $cart_item['data'];
$price = change_price_by_language($product->get_price(), $product);
return wc_price($price);
}Сравнение подходов изменения цены по языку
| Метод | Плюсы | Минусы |
|---|---|---|
| Код через фильтры (пример выше) | Быстро, гибко, без плагинов | Требует поддержки, не масштабируется для большого каталога |
| Плагины мультиязычности с поддержкой цен | Полная интеграция, удобный интерфейс | Стоимость, нагрузка на сайт |
| Отдельные товары на каждый язык | Максимальная гибкость | Сложность управления, возможны дубли |