Программное изменение способов оплаты в WooCommerce

20 мар. 2014 г., 10:37:01
Просмотры: 15.8K
Голосов: 1

Я пытаюсь программно управлять выбором способа оплаты между BACS и опцией "Без оплаты". Мой клиент хочет иметь возможность только запрашивать цену, поэтому я расширил действия и фильтры WooCommerce и реализовал метод запроса цены через систему корзины. Если пользователь запросил только цену, на странице оформления заказа я пытаюсь автоматически выбрать вариант "Наложенный платеж", который я переименовал в "Только запрос цены - Без оплаты". Буду благодарен за любые советы.

0
Все ответы на вопрос 2
1

Существует фильтр под названием woocommerce_available_payment_gateways:

add_filter('woocommerce_available_payment_gateways','filter_gateways',1);
function filter_gateways($gateways){
    global $woocommerce;        
    // Удаляем конкретный способ оплаты
    unset($gateways['paypal']);
    return $gateways;
}

Я не уверен, где и как вы получаете / сохраняете опцию "Запрос предложения", но вы можете получить доступ к значению внутри функции filter_gateways и удалить конкретный платежный шлюз с помощью условной логики.

20 мар. 2014 г. 12:00:32
Комментарии

Я использовал этот фильтр, и он отлично работает без моей условной логики. Думаю, проблема в том, что значение, указывающее на запрос предложения, передается через query vars. Получается, что сначала фильтр выводит значение моего query var, но затем варианты оплаты динамически перезагружаются, вероятно, из-за выбора способов доставки, и тогда мой query var теряется. Кажется, я на верном пути, но встроить условную логику в этот фильтр оказывается довольно сложной задачей.

PipIWYG PipIWYG
20 мар. 2014 г. 13:21:13
0

Моя проблема заключалась в использовании query vars для хранения значения, указывающего, что запрос предназначен только для расчета стоимости. Область оплаты динамически обновляется на основе изменений в разделах оформления заказа, и при загрузке методы оплаты перезагружаются, а значения query vars теряются. Мне удалось решить эту проблему, используя функции WC()->session->set и WC()->session->get. Я добавил следующие два действия для управления макетом на основе значения сессии.

add_action("woocommerce_before_checkout_form", "custom_before_checkout_action");
function custom_before_checkout_action() {
    if (isset($_GET["quote"]) && $_GET["quote"] == "1") {
        echo '<h2>Запрос на расчет стоимости</h2>';
        WC()->session->set("quote","true");
    }
    else {
        WC()->session->set("quote","false");
        echo '<h2>Купить образец</h2>';
    }
}

add_filter('woocommerce_available_payment_gateways','filter_gateways',1);
function filter_gateways($gateways){
    if (WC()->session->get("quote") == "true")
        unset($gateways['bacs']);
    else
        unset($gateways['cod']);

    return $gateways;
}

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

20 мар. 2014 г. 19:45:48