Программно изменять Способы Оплаты WooCommerce
Я пытаюсь программно манипулировать выбором способа оплаты между BACS и опцией, не требующей оплаты. Мой клиент хочет иметь возможность запрашивать только котировки, поэтому я расширил действия и фильтры woocommerce и предоставил метод запроса котировок через систему корзины. Если пользователь запросил только предложение, на странице оформления заказа я пытаюсь автоматически выбрать опцию наложенного платежа, которую я переименовал в "Только запрос предложения - Без оплаты требуется". Любой совет был бы полезен.
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, и вы можете удалить определенный шлюз с условной логикой.
Моя проблема здесь заключалась в использовании переменных запроса для хранения значения, указывающего, что запрос предназначен только для предложения. Область оплаты динамически обновляется на основе изменений в областях оформления заказа, а при загрузке методы оплаты перезагружаются, и значения 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;
}
Это кажется, это помогает сохранить значение и добавить условную логику даже после перезагрузки области оплаты.