WooCommerce: разрешаем оплату разными валютами в одной корзине

В чем проблема с оплатой разных валют в одной корзине WooCommerce?

WooCommerce по умолчанию не поддерживает возможность добавлять в корзину товары с разными валютами. Это связано с тем, что валюта устанавливается глобально для магазина и не меняется для отдельных товаров. Если у вас мультивалютный магазин, где часть товаров продается в одной валюте, а другая часть — в другой, то клиент не сможет оформить заказ с товарами в разных валютах одновременно.

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

Диагностика проблемы: как понять, что валюты конфликтуют?

  • Добавьте в корзину товар в одной валюте.
  • Попробуйте добавить товар в другой валюте — WooCommerce обычно заменит первый товар или выдаст ошибку.
  • В админке валюта заказа фиксируется в одной (обычно в валюте, установленной в настройках магазина).

Если используете плагин мультивалютности, проверьте, как он работает с корзиной и заказами.

Пошаговое решение: разрешение оплаты разными валютами в одной корзине

1. Установка и настройка мультивалютного плагина с поддержкой корзины в нескольких валютах

Для решения задачи лучше использовать проверенные плагины, например:

  • Clearfy Pro — для оптимизации и управления валютами;
  • WooCommerce Multilingual + WPML — поддерживают мультивалютность и позволяют настроить валюту по товару;
  • WooCommerce Multi-Currency — плагин для мультивалютности с корзиной.

Обязательно проверьте, чтобы плагин поддерживал одновременную оплату товаров в разных валютах (функция редка и часто требует кастомной доработки).

2. Кастомный подход с разделением корзины по валютам

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

add_filter('woocommerce_add_to_cart_validation', function($passed, $product_id, $quantity) {
    $product_currency = get_post_meta($product_id, '_currency', true); // Нужно хранить валюту товара
    $current_cart_currency = WC()->session->get('cart_currency');

    if (!$current_cart_currency) {
        WC()->session->set('cart_currency', $product_currency);
    } elseif ($current_cart_currency !== $product_currency) {
        wc_add_notice('Нельзя добавлять товары в разных валютах в одну корзину. Пожалуйста, оформите отдельный заказ.', 'error');
        return false;
    }
    return $passed;
}, 10, 3);

Данный код проверяет валюту товара (которая должна храниться в метаполях) и запрещает добавлять в корзину товар с другой валютой. Это простой способ избежать смешения валют.

3. Настройка отображения валюты и цен на фронтенде

Чтобы покупатели видели актуальную валюту каждого товара, используйте фильтр woocommerce_get_price_html для вывода цены с нужной валютой:

add_filter('woocommerce_get_price_html', function($price_html, $product) {
    $currency = get_post_meta($product->get_id(), '_currency', true);
    if ($currency) {
        $price_html .= ' ' . $currency;
    }
    return $price_html;
}, 10, 2);

Как проверить, что решение работает

  • Добавьте в корзину товар с валютой А.
  • Попробуйте добавить товар с валютой Б — должна появиться ошибка.
  • При оформлении заказа валюта заказа соответствует валюте товаров в корзине.
  • Проверьте фронтенд — цены отображаются с правильной валютой.

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

  • Валюта не сохраняется в метаполях товара: Проверьте, что у каждого товара есть метаполе _currency. Без него код работать не будет.
  • Плагин мультивалютности конфликтует с кастомным кодом: Отключите кастомные фильтры и протестируйте работу плагина отдельно, затем интегрируйте поэтапно.
  • При оформлении заказа валюта меняется на основную магазина: Проверьте, что валюта заказа передается и сохраняется правильно в мета-данных заказа.
  • Ошибка при добавлении товаров в корзину: Используйте wc_add_notice() для информирования пользователя и убедитесь, что фильтр woocommerce_add_to_cart_validation возвращает false при ошибке.

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

  • Избегайте хранения валюты в пользовательских сессиях без проверки — это может привести к ошибкам при одновременных заказах.
  • Оптимизируйте запросы к базе — используйте кеширование для метаполей валюты.
  • Регулярно обновляйте плагины мультивалютности — они часто исправляют ошибки совместимости и безопасности.
  • Тестируйте оформление заказа во всех валютах, используемых магазином.

Таблица сравнения вариантов реализации мультивалютности в корзине WooCommerce

МетодПреимуществаНедостаткиКогда использовать
Готовый мультивалютный плагинБыстрая настройка, поддержка, обновленияНе всегда поддерживает оплату разных валют в одной корзинеЕсли нужен магазин с простой мультивалютностью
Кастомный код с разделением корзины по валютамГибкость, контроль логикиСложность поддержки, требует тестированияЕсли нужен строгий контроль и уникальная логика
Запрет смешивания валют (как в примере)Простая реализация, предотвращение ошибокПользователь не может покупать товары в разных валютах в одном заказеЕсли разрешить смешивание невозможно или не нужно
Как добавить автоматическое обновление тем и плагинов в WordPress
15.04.2026
Как автоматически удалять неиспользуемые изображения в WordPress
15.03.2026
Как создать последовательный импорт постов в WordPress с помощью REST API
04.03.2026
Автоматическое создание резервных копий в WordPress с помощью кода и плагинов
19.02.2026
WooCommerce: отмена платежа и возврат денег через API и хуки
01.06.2026