Диагностика проблемы: почему цены не меняются при смене валюты в WooCommerce
Многие магазины WooCommerce работают с несколькими валютами, особенно если магазин ориентирован на международных клиентов. Однако по умолчанию WooCommerce не поддерживает автоматическую конвертацию цен при смене валюты — цены товаров задаются в одной валюте и не меняются динамически.
Проблема усугубляется, если используются разные способы оплаты или курсы валют меняются часто. Без автоматической конвертации покупатель видит неправильную цену, что снижает доверие и может привести к отказам от покупки.
Как реализовать автоматическую смену цен при смене валюты в WooCommerce
Основные подходы
- Использовать плагин мультивалютности с автоматическим обновлением курсов.
- Реализовать конвертацию через кастомный код с использованием API курсов валют.
Плагины удобны, но часто платные или имеют ограниченный функционал. Кастомный код даёт полный контроль, но требует технических навыков.
Пошаговое решение с примером кода на основе API курсов валют
Рассмотрим вариант с кастомной автоматической конвертацией цен при смене валюты с использованием публичного API ExchangeRate-API.
1. Получение курса валют
function get_exchange_rate( $currency_from, $currency_to ) {
$api_key = 'ВАШ_API_КЛЮЧ';
$url = "https://v6.exchangerate-api.com/v6/" . $api_key . "/pair/" . $currency_from . "/" . $currency_to;
$response = wp_remote_get( $url );
if ( is_wp_error( $response ) ) {
return false;
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
if ( isset( $data['conversion_rate'] ) ) {
return floatval( $data['conversion_rate'] );
}
return false;
}2. Смена валюты и пересчёт цены
Добавим фильтр, который преобразует цены товаров на лету в выбранную валюту.
add_filter( 'woocommerce_get_price', 'convert_price_by_currency', 10, 2 );
function convert_price_by_currency( $price, $product ) {
if ( isset( $_COOKIE['selected_currency'] ) ) {
$currency = sanitize_text_field( $_COOKIE['selected_currency'] );
} else {
$currency = 'USD'; // валюта по умолчанию
}
$base_currency = 'USD'; // Валюта, в которой заданы цены в WooCommerce
if ( $currency === $base_currency ) {
return $price;
}
$rate = get_exchange_rate( $base_currency, $currency );
if ( $rate ) {
$converted_price = $price * $rate;
return round( $converted_price, 2 );
}
return $price;
}3. Добавление выбора валюты на сайт
Простой селектор валют, который сохраняет выбор пользователя в cookie.
function currency_selector() {
$currencies = array('USD', 'EUR', 'RUB');
$current = isset( $_COOKIE['selected_currency'] ) ? $_COOKIE['selected_currency'] : 'USD';
echo '<form id="currency-form" method="POST">';
echo '<select name="currency" onchange="this.form.submit()">';
foreach ( $currencies as $curr ) {
$selected = ( $curr === $current ) ? 'selected' : '';
echo "<option value=\"$curr\" $selected>$curr</option>";
}
echo '</select>';
echo '</form>';
}
add_action( 'wp_footer', 'currency_selector' );
function save_currency_cookie() {
if ( isset( $_POST['currency'] ) ) {
$currency = sanitize_text_field( $_POST['currency'] );
setcookie( 'selected_currency', $currency, time() + 3600 * 24 * 30, COOKIEPATH, COOKIE_DOMAIN );
// Перезагрузка страницы для применения изменений
wp_safe_redirect( wp_get_referer() ? wp_get_referer() : home_url() );
exit;
}
}
add_action( 'init', 'save_currency_cookie' );Проверка результата после внедрения
- Перейдите на страницу товара в стандартной валюте (USD) и запомните цену.
- Выберите другую валюту в селекторе, например EUR.
- Страница перезагрузится, цены на товарах должны измениться согласно курсу с API.
- Проверьте, что корзина и страницы оформления заказа показывают цены в выбранной валюте.
- Если цены не меняются, проверьте cookie
selected_currencyи ответ API.
Частые ошибки и как их исправить
- Ошибка: API не возвращает курс или возвращает ошибку.
Причина: неверный API-ключ или превышен лимит запросов.
Решение: проверьте API-ключ, используйте кеширование запроса (например, сохраняйте курс в transient на час). - Ошибка: Цены не меняются после выбора валюты.
Причина: cookie не сохраняется или фильтр на цену не срабатывает.
Решение: проверьте установку cookie и правильность применения хукаwoocommerce_get_price. - Ошибка: Конвертация происходит некорректно для вариативных товаров.
Причина: цену вариативного товара нужно конвертировать отдельно.
Решение: расширьте фильтр и дляwoocommerce_get_price_htmlили используйте дополнительные хуки для вариативных товаров.
Практические советы по безопасности и производительности
- Кешируйте курсы валют с помощью
set_transient, чтобы не делать API-запрос на каждый просмотр. - Валидация и очистка данных из cookie и POST обязательна для предотвращения XSS и других атак.
- Не храните цены в базе в разных валютах, это увеличит сложность и может вести к ошибкам.
- Для крупных магазинов лучше использовать проверенные мультивалютные плагины с поддержкой WooCommerce и валютных курсов.
Сравнение вариантов реализации автоматической конвертации валюты
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин мультивалютности | Быстрое развертывание, поддержка курсов, интеграция с оплатой | Платные, ограниченная кастомизация | WooCommerce Multilingual, Currency Switcher |
| Кастомный код с API курсов | Полный контроль, можно оптимизировать под задачи | Требует навыков, нужно поддерживать | Код в статье |
| Статические цены в нескольких валютах | Простота реализации | Нужно вручную обновлять цены, не автоматично | Добавление валютных цен в метаполя |