Проблема: цены товаров не адаптируются под язык сайта
При использовании мультиязычных плагинов, таких как WPML или Polylang, часто возникает задача показывать разные цены товаров в WooCommerce в зависимости от выбранного языка. Стандартный функционал WooCommerce не предусматривает такую возможность, и без дополнительной настройки цены остаются одинаковыми для всех языков, что негативно сказывается на удобстве и конверсии.
Диагностика проблемы
Чтобы убедиться, что проблема именно в отсутствии динамического изменения цены, проверьте:
- Используете ли вы мультиязычный плагин (WPML, Polylang и т.п.).
- Настроены ли валюты для каждого языка (в случае работы с разными валютами).
- Отображаются ли цены одинаково при переключении языков.
- Проверили ли вы, что цены в переводных версиях товаров не изменены вручную.
Если все пункты подтверждаются, значит нужно реализовать динамическую подстановку цены программно.
Пошаговое решение: добавляем динамическую цену по языку через хук WooCommerce
Реализуем динамическое изменение цены с помощью фильтра woocommerce_get_price, который позволяет менять цену товара на лету.
1. Определяем текущий язык
Для этого используем функции мультиязычного плагина. Например, для WPML:
function get_current_language() {
if (function_exists('icl_object_id')) {
return apply_filters('wpml_current_language', NULL);
}
return 'default';
}2. Добавляем фильтр для изменения цены
add_filter('woocommerce_get_price', 'change_price_by_language', 10, 2);
function change_price_by_language($price, $product) {
$lang = get_current_language();
// Пример изменения цены: увеличиваем на 10% для английского
if ($lang === 'en') {
$price = $price * 1.10;
} elseif ($lang === 'fr') {
// для французского уменьшаем на 5%
$price = $price * 0.95;
}
// Добавьте другие языки и логику по необходимости
return $price;
}3. Обработка вариативных товаров
Для вариативных товаров аналогично применяем фильтр woocommerce_get_variation_price:
add_filter('woocommerce_get_variation_price', 'change_variation_price_by_language', 10, 3);
function change_variation_price_by_language($price, $variation, $display) {
$lang = get_current_language();
if ($lang === 'en') {
$price = $price * 1.10;
} elseif ($lang === 'fr') {
$price = $price * 0.95;
}
return $price;
}Проверка результата после внедрения
- Перейдите на сайт и переключитесь на различные языки.
- Проверьте, что цена товара изменяется согласно вашей логике.
- Убедитесь, что в корзине и на странице оформления заказа отображается правильная цена.
- Протестируйте вариативные товары с разными вариантами — цены должны корректно меняться.
- Очистите кэш сайта и браузера, если не видите изменений.
Частые ошибки и их исправление
- Фильтр не срабатывает: убедитесь, что добавляете код в functions.php вашей активной темы или в плагин, и что приоритет вызова фильтра не конфликтует с другими плагинами.
- Неверное определение языка: функции мультиязычного плагина могут отличаться, проверьте, что используете правильный API для определения текущего языка.
- Цены не меняются в корзине или на странице заказа: WooCommerce кэширует цены, добавьте фильтры на другие хуки, например
woocommerce_cart_item_price. - Проблемы с курсами валют: если используете разные валюты, лучше использовать плагин мультивалютности, а не менять цену вручную.
Практические советы по безопасности и производительности
- Не храните цены для каждого языка в пользовательских полях без необходимости — используйте динамическое изменение, чтобы избежать дублирования данных.
- Добавляйте кэширование вычисленных цен, если логика сложная, чтобы снизить нагрузку на сервер.
- Всегда проверяйте совместимость с вашим мультиязычным плагином и WooCommerce после обновлений.
- Для SEO лучше использовать отдельные URL для каждого языка, чтобы цены были восприняты корректно поисковиками.
Сравнение подходов для мультиязычных цен в WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное редактирование цен в переводах | Создание отдельных товаров для каждого языка с разными ценами | Простота реализации, точный контроль цены | Дублирование товаров, сложность управления |
| Плагины мультивалютности | Использование плагинов для автоматического переключения валют и цен | Автоматизация, поддержка курсов валют | Зависимость от плагина, возможны конфликты |
| Динамическое изменение цены через хуки | Программное изменение цены на лету по языку | Гибкость, отсутствие дублирования данных | Требуется разработка, возможны проблемы с кэшированием |