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

Диагностика проблемы: почему цены не меняются при смене валюты в 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 курсовПолный контроль, можно оптимизировать под задачиТребует навыков, нужно поддерживатьКод в статье
Статические цены в нескольких валютахПростота реализацииНужно вручную обновлять цены, не автоматичноДобавление валютных цен в метаполя
Автоматический подбор категорий для постов в WordPress: практическое руководство
05.04.2026
Как автоматизировать удаление старого контента в WordPress: практические решения и примеры кода
31.03.2026
WooCommerce: как установить лимит на количество товаров в корзине
17.04.2026
Как создать автоматический импорт продуктов в WooCommerce с использованием REST API
10.02.2026
WooCommerce: как автоматически изменять наличие товаров и отключать оформление заказа при отсутствии товара
29.06.2026