WooCommerce: Автоматическое обновление стоимости товаров при изменении валюты

Почему важно автоматически обновлять цены товаров при смене валюты в 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);
}

Проверка результата: как убедиться, что цены обновляются корректно

  1. Откройте сайт в режиме инкогнито или очистите куки.
  2. Выберите валюту отличную от базовой (USD в примере) через переключатель валюты.
  3. Проверьте отображение цен в каталоге, карточках товаров, корзине и при оформлении заказа.
  4. Сравните цены с актуальным курсом валют на сайте API.
  5. Используйте инструменты разработчика браузера, чтобы убедиться, что куки с валютой установлены правильно.

Частые ошибки и как их исправить

  • Проблема: Цены не меняются при переключении валюты.
    Причина: Неправильно установлен или не обновляется cookie с валютой.
    Решение: Проверьте логику переключателя валюты, убедитесь, что cookie wc_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().
Как создать собственный шорткод в WordPress
05.11.2025
Как отменить удаление пользователей WordPress без удаления их постов
22.02.2026
Автоматическое отключение неактивных товаров в WooCommerce по дате последней покупки
26.05.2026
Как избежать проблем со снижением производительности при массовом импорте продуктов в WooCommerce
13.05.2026
Как избежать конфликтов между плагинами в WordPress: практические решения
12.01.2026