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

Существует фильтр под названием 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
и удалить конкретный платежный шлюз с помощью условной логики.

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

Моя проблема заключалась в использовании 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;
}
Это решение позволяет сохранить значение и добавить условную логику даже после перезагрузки области оплаты.
