WooCommerce: как добавить поддержку нескольких валют без плагинов

Диагностика задачи: зачем нужна мультивалютность в WooCommerce

Большинство интернет-магазинов WooCommerce по умолчанию работают с одной валютой. Однако, если вы продаёте товары международной аудитории, возникает необходимость отображать цены в разных валютах, чтобы повысить конверсию и удобство пользователей.

Типичные признаки необходимости мультивалютной поддержки:

  • Посетители из разных стран жалуются на неудобство конвертации;
  • Резкое падение продаж с международных IP;
  • Желание расширить рынок без установки дополнительных плагинов.

Пошаговое решение: добавляем мультивалютность вручную через код

1. Создаём пользовательский селектор валют

Добавим селектор валют в верхнюю часть сайта, чтобы пользователь мог выбрать нужную валюту.

add_action('wp_head', function() {
    if (!isset($_COOKIE['user_currency'])) {
        setcookie('user_currency', 'USD', time() + 3600 * 24 * 30, COOKIEPATH, COOKIE_DOMAIN);
        $_COOKIE['user_currency'] = 'USD';
    }
});

add_action('wp_footer', function() {
    ?>
    <form method="post" id="currency-switcher" style="position: fixed; top: 10px; right: 10px; z-index: 9999;">
        <select name="user_currency" onchange="document.getElementById('currency-switcher').submit()">
            <option value="USD" <?php selected($_COOKIE['user_currency'], 'USD'); ?>>USD</option>
            <option value="EUR" <?php selected($_COOKIE['user_currency'], 'EUR'); ?>>EUR</option>
            <option value="RUB" <?php selected($_COOKIE['user_currency'], 'RUB'); ?>>RUB</option>
        </select>
    </form>
    <?php
});

add_action('init', function() {
    if (isset($_POST['user_currency'])) {
        setcookie('user_currency', sanitize_text_field($_POST['user_currency']), time() + 3600 * 24 * 30, COOKIEPATH, COOKIE_DOMAIN);
        // Перезагружаем страницу для применения новой валюты
        wp_safe_redirect($_SERVER['REQUEST_URI']);
        exit;
    }
});

2. Подключаем конвертацию цен на фронтенде

Для конвертации цен внедрим фильтр woocommerce_get_price_html, который будет изменять отображаемую цену с учётом выбранной валюты.

add_filter('woocommerce_get_price_html', function($price_html, $product) {
    $currency = $_COOKIE['user_currency'] ?? 'USD';
    $price = $product->get_price();

    // Курсы валют (пример, можно обновлять через API)
    $rates = [
        'USD' => 1,
        'EUR' => 0.9,
        'RUB' => 70,
    ];

    // Если валюта не поддерживается, возвращаем изначальную цену
    if (!isset($rates[$currency])) {
        return $price_html;
    }

    $converted_price = $price * $rates[$currency];

    // Форматируем цену
    switch ($currency) {
        case 'EUR':
            $symbol = '€';
            break;
        case 'RUB':
            $symbol = '₽';
            break;
        default:
            $symbol = '$';
    }

    return sprintf('%s%.2f', $symbol, $converted_price);
}, 10, 2);

3. Сохраняем валюту в заказах

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

add_action('woocommerce_checkout_create_order', function($order) {
    if (isset($_COOKIE['user_currency'])) {
        $order->update_meta_data('user_currency', sanitize_text_field($_COOKIE['user_currency']));
    } else {
        $order->update_meta_data('user_currency', 'USD');
    }
});

Проверка результата после внедрения

  • На сайте появился селектор валют, который меняет отображение цен сразу после выбора;
  • Цены товаров на страницах каталога, карточках товаров и в корзине отображаются в выбранной валюте;
  • Созданные заказы содержат метаданные с валютой;
  • Ручная смена валюты через селектор сохраняется в cookie и применяется на всех страницах.

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

  • Цены не меняются после выбора валюты: проверьте, что куки устанавливаются и доступны, а также что фильтр woocommerce_get_price_html подключён с правильным приоритетом.
  • Курс валют устарел: используйте API актуальных курсов из внешних сервисов (например, exchangeratesapi.io) и обновляйте массив $rates автоматически.
  • Цена в корзине и на странице оформления заказа не совпадает с отображаемой: добавьте фильтры на расчёт цены woocommerce_product_get_price и woocommerce_product_get_regular_price для конвертации, а также учитывайте валюту при создании и обработке заказов.
  • Проблемы с кешированием: при использовании плагинов кеширования исключите из кеша страницы с переключателем валют или добавьте динамические фрагменты.

Практические советы по безопасности и производительности

  • Не доверяйте значениям из $_COOKIE напрямую — всегда фильтруйте и проверяйте.
  • Курсы валют лучше хранить в transient с временем жизни 12 часов, чтобы не перегружать сервер при частых запросах.
  • Для улучшения UX используйте AJAX для смены валюты без перезагрузки страницы.
  • Учитывайте, что WooCommerce по умолчанию не поддерживает мультивалютность, поэтому для сложных кейсов лучше использовать специализированные плагины (например, WooCommerce Multilingual), особенно если нужны платежи в разных валютах.

Сравнение подходов к мультивалютности в WooCommerce

МетодПреимуществаНедостатки
Ручная реализация через фильтры и кукиПолный контроль, без дополнительных плагинов, легковесноТребует поддержки, нет интеграции с платежными шлюзами, ограниченная функциональность
Плагины мультивалютности (например, WooCommerce Multilingual)Полная интеграция с платежами, автоматическое обновление курсов, удобный интерфейсДополнительная нагрузка, возможные конфликты, платные версии
Внешний сервис конвертации + кастомный кодАктуальные курсы, можно гибко настраиватьЗависимость от API, сложность в поддержке
Оптимальное использование хуков и фильтров в WordPress: практические примеры и советы
13.12.2025
WooCommerce: как успешно настроить генерацию PDF-фактур без плагинов
10.05.2026
Как добавить поддержку REST API в старом шаблоне WordPress
12.04.2026
WooCommerce: как быстро удалить неиспользуемые вариации продуктов через код
22.05.2026
Как создать настройки темы в WordPress с примерами кода
02.12.2025