Почему важно автоматически обновлять цены товаров при смене валюты в WooCommerce
WooCommerce из коробки не поддерживает автоматическое обновление цен товаров при изменении валюты, если вы используете фиксированные цены. Это создает проблему для магазинов с мультивалютностью: цены остаются старыми и не отражают актуальный курс, что ведет к потере продаж или необходимости ручного обновления.
Решение этой задачи особенно актуально для магазинов с большими каталогами, где ручное обновление невозможно. В статье рассмотрим, как реализовать обновление цен с помощью кода и сторонних плагинов, а также как правильно настроить интеграцию с API курсов валют.
Диагностика проблемы: как проверить, нуждается ли ваш магазин в автоматическом обновлении цен
- В магазине используется несколько валют, но цены товаров заданы фиксированными в основной валюте.
- При переключении валюты цены товаров не меняются или меняются некорректно.
- В каталоге большое количество товаров, что делает ручное обновление непрактичным.
- Используется плагин мультивалютности, но без поддержки автоматического обновления цен.
Чтобы проверить, как ведет себя ваш магазин, переключите валюту на сайте и убедитесь, что цены товаров изменяются в соответствии с курсом. Если нет — значит, нужно внедрять автоматизацию.
Пошаговое решение: как реализовать автоматическое обновление цен товаров при смене валюты
1. Выбор метода: плагин или кастомный код
Для начала решите, использовать готовое решение или писать код:
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин мультивалюты с поддержкой динамических курсов | Быстрая настройка, поддержка обновлений, интеграция с API валют | Может быть платным, ограниченная кастомизация | Clearfy Pro с модулем мультивалюты |
| Кастомный код с интеграцией к API курсов валют | Полный контроль, можно адаптировать под любые требования | Требует навыков разработки, поддержка и обновления на вас | Пример кода ниже |
2. Интеграция с API курсов валют
В примере используем API ExchangeRate-API. Для работы нужно получить API-ключ (бесплатный тариф подходит для базовых задач).
3. Код для автоматического обновления цен на фронтенде
Добавьте в functions.php вашей темы или в отдельный плагин следующий код:
function get_exchange_rates() {
$api_key = 'ВАШ_КЛЮЧ_ЗДЕСЬ';
$request = wp_remote_get("https://v6.exchangerate-api.com/v6/" . $api_key . "/latest/USD");
if (is_wp_error($request)) {
return false;
}
$body = wp_remote_retrieve_body($request);
$data = json_decode($body, true);
if ($data['result'] !== 'success') {
return false;
}
return $data['conversion_rates'];
}
function convert_price_by_currency($price, $target_currency, $rates) {
if (!isset($rates[$target_currency])) {
return $price; // Нет курса - возвращаем исходную цену
}
return round($price * $rates[$target_currency], 2);
}
add_filter('woocommerce_get_price_html', 'dynamic_price_html_by_currency', 10, 2);
function dynamic_price_html_by_currency($price_html, $product) {
// Получаем текущую валюту (пример, если храните в сессии или куках)
$current_currency = isset($_COOKIE['wc_currency']) ? sanitize_text_field($_COOKIE['wc_currency']) : 'USD';
if ($current_currency === 'USD') { // Базовая валюта магазина
return $price_html;
}
$rates = get_exchange_rates();
if (!$rates) {
return $price_html; // Не удалось получить курсы
}
$regular_price = floatval($product->get_regular_price());
$converted_price = convert_price_by_currency($regular_price, $current_currency, $rates);
return wc_price($converted_price, array('currency' => $current_currency));
}В этом коде:
- Мы получаем курсы валют из API с базовой валютой USD.
- Конвертируем цену товара в текущую валюту, которая хранится в cookie
wc_currency(можно адаптировать под ваш механизм переключения валют). - Возвращаем цену в нужной валюте в формате WooCommerce.
4. Обновление корзины и оформления заказа
Чтобы цены корректно отображались и в корзине, и при оформлении заказа, используйте фильтры WooCommerce для цены товара в заказе. Например:
add_filter('woocommerce_product_get_price', 'convert_price_for_order', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'convert_price_for_order', 10, 2);
function convert_price_for_order($price, $product) {
$current_currency = isset($_COOKIE['wc_currency']) ? sanitize_text_field($_COOKIE['wc_currency']) : 'USD';
if ($current_currency === 'USD') {
return $price;
}
$rates = get_exchange_rates();
if (!$rates) {
return $price;
}
return convert_price_by_currency($price, $current_currency, $rates);
}Проверка результата: как убедиться, что цены обновляются корректно
- Откройте сайт в режиме инкогнито или очистите куки.
- Выберите валюту отличную от базовой (USD в примере) через переключатель валюты.
- Проверьте отображение цен в каталоге, карточках товаров, корзине и при оформлении заказа.
- Сравните цены с актуальным курсом валют на сайте API.
- Используйте инструменты разработчика браузера, чтобы убедиться, что куки с валютой установлены правильно.
Частые ошибки и как их исправить
- Проблема: Цены не меняются при переключении валюты.
Причина: Неправильно установлен или не обновляется cookie с валютой.
Решение: Проверьте логику переключателя валюты, убедитесь, что cookiewc_currencyзадается и доступен в PHP. - Проблема: Задержка при загрузке цен или ошибки API.
Причина: Запросы к API происходят при каждом запросе страницы.
Решение: Кешируйте результаты API с помощью транзиентов WordPress, например, на 1 час. - Проблема: Неправильное округление цен.
Решение: Используйте функциюround()с двумя знаками после запятой и стандартные функции WooCommerce для форматирования ценыwc_price(). - Проблема: Цены не обновляются в админке.
Решение: Логика конвертации должна применяться только на фронтенде, чтобы не мешать админской работе с товарами.
Практические советы по безопасности и производительности
- Используйте
wp_remote_get()с таймаутами и обработкой ошибок, чтобы избежать зависаний сайта при недоступности API. - Кешируйте курсы валют в базе WordPress с помощью
set_transient()иget_transient()на 30-60 минут. - Не храните API-ключи в публичных местах — лучше определить их в
wp-config.phpили через переменные окружения. - Проверяйте и фильтруйте входящие данные (например, валюту из cookie) с помощью
sanitize_text_field().