WooCommerce: как автоматически менять цены товаров при смене валюты

Диагностика задачи: зачем нужна автоматическая смена цен при смене валюты

Магазины на 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 и динамическим пересчетом (примеры в статье)Гибкость, актуальные курсы, контроль логикиТребует навыков разработки, необходимо кешированиеОптимально для разработчиков и кастомных решений
WooCommerce: как автоматически удалять неактивные заказы через код
04.06.2026
Как создать свой плагин для очистки базы данных WordPress
29.11.2025
WooCommerce: как автоматически изменять наличие товаров и отключать оформление заказа при отсутствии товара
29.06.2026
Как изменить URL авторского блока WordPress без плагинов
21.02.2026
Как автоматизировать удаление спам комментариев в WordPress
01.01.2026