Диагностика задачи: зачем нужна автоматическая смена цен при смене валюты
Магазины на WooCommerce с несколькими валютами часто сталкиваются с проблемой: цены в базе хранятся в одной валюте, и при переключении валюты на сайте необходимо корректно пересчитывать цены товаров. Без автоматизации приходится вручную задавать цены для каждой валюты или использовать плагины с ограниченным функционалом.
Если на вашем сайте цены не меняются при смене валюты, клиенты видят некорректные данные, что приводит к потерям продаж и недовольству.
Обзор существующих методов реализации
1. Плагины мультивалютности
Самый простой способ — использовать готовые решения, например, Clearfy Pro или другие мультивалютные плагины. Минус — высокая нагрузка, зависимость от плагина и возможные ограничения в настройках.
2. Пользовательский код с использованием API валютных курсов
Более гибкий, но требует разработки. Можно получать курсы валют из внешних API и динамически пересчитывать цены через фильтры WooCommerce.
Пошаговое решение: автоматическое изменение цены товара при смене валюты через код
Шаг 1. Подключение API валют
Для примера возьмём бесплатный API ExchangeRate-API. Зарегистрируйтесь, получите ключ и используйте endpoint для получения курсов.
function get_exchange_rates() {
$api_key = 'ВАШ_API_КЛЮЧ';
$response = wp_remote_get( 'https://v6.exchangerate-api.com/v6/' . $api_key . '/latest/USD' );
if ( is_wp_error( $response ) ) {
return false;
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
if ( isset( $data['conversion_rates'] ) ) {
return $data['conversion_rates'];
}
return false;
}Шаг 2. Определение текущей валюты пользователя
Допустим, мы храним валюту в сессии или куках. Пример получения валюты из куки:
function get_current_currency() {
if ( isset( $_COOKIE['current_currency'] ) ) {
return sanitize_text_field( $_COOKIE['current_currency'] );
}
return 'USD'; // базовая валюта
}Шаг 3. Пересчет цены товара
Используем фильтр woocommerce_product_get_price и woocommerce_product_get_regular_price, чтобы динамически менять цену при выводе товара:
add_filter( 'woocommerce_product_get_price', 'change_price_by_currency', 10, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'change_price_by_currency', 10, 2 );
function change_price_by_currency( $price, $product ) {
$base_currency = 'USD'; // валюта в базе
$current_currency = get_current_currency();
if ( $current_currency === $base_currency ) {
return $price;
}
$rates = get_exchange_rates();
if ( ! $rates || ! isset( $rates[ $current_currency ] ) ) {
return $price; // если курс не доступен
}
$rate = $rates[ $current_currency ];
$new_price = $price * $rate;
return round( $new_price, 2 );
}Шаг 4. Пересчет отображаемой валюты
Для корректного отображения валютного символа нужно изменить WooCommerce опцию валюты. Это можно сделать через фильтр woocommerce_currency:
add_filter( 'woocommerce_currency', 'set_current_currency' );
function set_current_currency( $currency ) {
return get_current_currency();
}Проверка результата после внедрения
- Откройте страницу товара, переключите валюту (например, через изменение куки
current_currencyна 'EUR' или другую. - Цена должна измениться пропорционально курсу из API.
- Корзина и страницы оформления заказа должны показывать цены в выбранной валюте.
Для отладки можно добавить вывод цены и валюты в шаблон:
echo 'Цена: ' . wc_price( $product->get_price() );
echo 'Текущая валюта: ' . get_current_currency();Частые ошибки и как их исправить
- Курс валют не обновляется: кеширование результатов API. Решение: добавьте transient-кеширование с тайм-аутом 1 час.
- Цена меняется, но валюта остается прежней: не применяется фильтр
woocommerce_currencyили валюта не корректно сохраняется в куки. - Пересчет цены влияет на скидки и купоны: используйте фильтры с осторожностью, тестируйте на совместимость с купонами.
- Производительность падает из-за частых запросов к API: внедрите локальное кеширование через
set_transientиget_transient.
Практические советы по безопасности и производительности
- Не храните API ключи в открытом виде - задайте их в
wp-config.phpили через переменные среды. - Используйте кеширование курсов валют с помощью WordPress Transients API, например:
function get_exchange_rates() {
$rates = get_transient( 'exchange_rates' );
if ( $rates !== false ) {
return $rates;
}
// запрос к API как выше
// после получения сохраните:
set_transient( 'exchange_rates', $data['conversion_rates'], HOUR_IN_SECONDS );
return $data['conversion_rates'];
}- Обрабатывайте ошибки запросов к API, чтобы не нарушить работу магазина.
- Используйте точное округление цен, чтобы избежать ошибок при оплате.
- Для улучшения UX добавьте переключатель валюты, который меняет куки и перезагружает страницу.
Сравнение подходов автоматической смены цен
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Готовые плагины мультивалюты | Быстрое внедрение, поддержка | Нагрузка, стоимость, ограниченная кастомизация | Для магазинов без специфических требований |
| Ручной ввод цен по валютам | Точный контроль цен | Трудоемко, не масштабируемо | Для небольших магазинов с фиксированными курсами |
| Код с API и динамическим пересчетом (примеры в статье) | Гибкость, актуальные курсы, контроль логики | Требует навыков разработки, необходимо кеширование | Оптимально для разработчиков и кастомных решений |