Программная настройка валюты WooCommerce

Вопрос или проблема

У меня возникла проблема, когда я должен программно изменить валюту. Я делаю AJAX-вызов и заметил, что возвращаемые результаты не учитывают, какую валюту установил пользователь.

Теперь я назначаю валюту в вызове $.ajax, однако проблема заключается в том, чтобы WordPress программно изменял валюту в этом вызове. Я очень удивлен, что нет очевидного решения для этого.

Я ожидал бы функцию вроде woocommerce_set_currency('EUR').

В общем, мне нужно изменить отображаемую валюту для шаблона следующим образом:

set_viewed_currency('USD'); // какая-то функция для изменения валюты перед рендерингом
wc_get_template('modal-single-product.php');

При проверке исходного кода плагина, который мы используем (WooCommerce Multicurrency), я нашел следующее решение:

WOOMULTI_CURRENCY_Data::get_ins()->set_current_currency($_POST['wmc-currency']);

Однако я бы хотел, чтобы был более прямой способ с использованием woocommerce.

Вы можете получить ID страницы, на которой будете изменять валюту, а затем вернуть новую валюту в фильтр woocommerce woocmmerce_currency

add_filter( 'woocommerce_currency', 'change_woocommerce_currency' );
function change_woocommerce_currency( $currency ) {
    if ( ! is_singular() ) {
        return false;
    }
    global $post;
    $current_page_id = $post->ID;
    $saved_page_id   = 15; // получить ID страницы, которую вы хотите
    if ( $current_page_id == $saved_page_id ) {
        $currency = '$$$'; // или какой-либо другой символ валюты
    }

    return $currency;
}

Ответ или решение

В современном мире электронной торговли важно, чтобы веб-сайты, особенно основанные на WordPress с использованием WooCommerce, обеспечивали гибкость в настройке отображаемой валюты. Будучи экспертом в области информационных технологий, вы понимаете, что иногда требуется сменить валюту программно, чтобы соответствовать потребностям бизнеса или предпочтениям пользователя. Рассмотрим, как это можно осуществить, используя существующую функциональность WooCommerce и сторонние плагины, а также возможности AJAX.

Теория:

Необходимость в программной смене валюты обычно возникает в сценариях, где валюта должна динамически меняться в зависимости от действий пользователя или других критериев, таких как геолокация или предпочтения, установленные в ходе взаимодействия с веб-сайтом. В WooCommerce по умолчанию нет четкой функции, подобной «woocommerce_set_currency(‘EUR’)», что ограничивает возможности для быстрого переключения валют через стандартные инструменты. Это происходит потому, что стандартная архитектура WooCommerce предполагает настройку валюты на уровне магазина, а не на уровне отдельных сессий или пользователей.

Пример:

В описанном случае проблема заключается в том, что AJAX-запросы не учитывают смену валюты, поскольку они выполняются асинхронно, и WordPress не учитывает эти изменения при рендеринге шаблонов. Например, вы вызываете функцию «wc_get_template(‘modal-single-product.php’)», но видите, что отображаемая информация не обновляется с учетом установленной валюты.

Ваше текущее решение основано на использовании функции WOOMULTI_CURRENCY_Data::get_ins()->set_current_currency($_POST['wmc-currency']) из плагина WooCommerce Multicurrency. Этот подход работает, но требует использования стороннего плагина, и нет нативного решения средствами WooCommerce без их дополнительных инструментов.

Применение:

Чтобы применить решение в ваших сценариях, существует несколько подходов:

  1. Использование фильтров WordPress:

    WooCommerce предоставляет фильтр woocommerce_currency, который позволяет переопределить текущую валюту. Если ваша логика зависит от конкретных страниц или условий, вы можете адаптировать фильтр следующим образом:

    add_filter( 'woocommerce_currency', 'change_woocommerce_currency' );
    function change_woocommerce_currency( $currency ) {
       if ( ! is_singular() ) {
           return $currency;
       }
       global $post;
       $current_page_id = $post->ID;
       $saved_page_id = 15; // ID страницы, для которой вы хотите изменить валюту
       if ( $current_page_id == $saved_page_id ) {
           $currency = 'USD'; // Укажите нужный код валюты
       }
    
       return $currency;
    }
  2. Обработка AJAX-запросов:

    Если необходимо программно менять валюту в соответствии с пользовательскими действиями на странице, например, через AJAX, можно следовать такому подходу:

    • Создайте обработчик AJAX-запросов, который будет изменять значение валюты.
    • Используйте механизм сессий или cookies для хранения предпочтительной валюты пользователя.
    • Перевызовите шаблон с обновленной валютой.

    Например, обработчик может выглядеть следующим образом:

    add_action('wp_ajax_change_currency', 'change_currency_callback');
    add_action('wp_ajax_nopriv_change_currency', 'change_currency_callback');
    
    function change_currency_callback() {
       if( isset($_POST['currency']) ) {
           $new_currency = sanitize_text_field($_POST['currency']);
           WC()->session->set('chosen_currency', $new_currency);
           echo 'Currency set to ' . WC()->session->get('chosen_currency');
       } else {
           echo 'Currency was not set';
       }
       wp_die();
    }

    Затем, на стороне клиента, AJAX-вызов будет выглядеть следующим образом:

    $.ajax({
       type: "POST",
       url: your_ajax_url,
       data: {
           action: 'change_currency',
           currency: 'EUR'
       },
       success: function(response) {
           console.log(response);
           location.reload(); // обновляем страницу, чтобы изменения вступили в силу
       }
    });
  3. Плагины мультивалютности:

    Использование плагинов, таких как WooCommerce Multicurrency, остается одним из самых простых и надежных способов реализации мультивалютности без значительных усилий по разработке. Эти плагины уже предлагают определенные API для изменения валюты, и в долгосрочной перспективе это может быть более устойчивым решением.

Каждое из решений имеет свои преимущества и недостатки, и выбор подхода зависит от потребностей вашего проекта и уровня ваших навыков разработки. При реализации решения важно помнить о потенциальных проблемах с кэшированием и сессиями, так как эти факторы могут влиять на поведение сайта в условиях многопользовательского использования.

Оцените материал
Добавить комментарий

Капча загружается...