Программно изменять Способы Оплаты WooCommerce


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

Author: PipIWYG, 2014-03-20

2 answers

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

add_filter('woocommerce_available_payment_gateways','filter_gateways',1);
function filter_gateways($gateways){
    global $woocommerce;        
    //Remove a specific payment option
    unset($gateways['paypal']);
    return $gateways;
}

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

 2
Author: passatgt, 2019-11-30 08:54:01

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

add_action("woocommerce_before_checkout_form", "custom_before_checkout_action");
function custom_before_checkout_action() {
    if (isset($_GET["quote"]) && $_GET["quote"] == "1") {
        echo '<h2>Request for Quote</h2>';
        WC()->session->set("quote","true");
    }
    else {
        WC()->session->set("quote","false");
        echo '<h2>Buy Sample</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;
}

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

 1
Author: PipIWYG, 2014-03-20 17:45:48