Cum să schim programatic metodele de plată în WooCommerce
Încerc să manipulez programatic selecția metodei de plată între transfer bancar (BACS) și o opțiune "Fără plată necesară". Clientul meu dorește posibilitatea de a cere doar ofertă, așa că am extins acțiunile și filtrele WooCommerce și am oferit o metodă pentru solicitarea ofertei prin sistemul de coș. Dacă utilizatorul a solicitat doar o ofertă, pe pagina de finalizare comandă încerc să selectez automat opțiunea de plată la livrare, pe care am redenumit-o în "Solicitare ofertă - Fără plată necesară". Orice sfat ar fi util.

Există un filtru numit woocommerce_available_payment_gateways
:
add_filter('woocommerce_available_payment_gateways','filter_gateways',1);
function filter_gateways($gateways){
global $woocommerce;
// Elimină o opțiune specifică de plată
unset($gateways['paypal']);
return $gateways;
}
Nu sunt sigur unde și cum obții/stochezi opțiunea pentru Cerere de Ofertă, dar poți accesa valoarea în interiorul funcției filter_gateways
și poți elimina o metodă de plată specifică folosind o logică condițională.

Am folosit acest filtru, da, și funcționează excelent fără logica mea condițională. Cred că problema este că valoarea care indică faptul că este o Cerere de Ofertă este transmisă prin variabilele de interogare. Ce se întâmplă este că, la început, va afișa valoarea variabilei mele de interogare în cadrul funcției de filtru, dar apoi opțiunile de plată sunt reîncărcate dinamic, se pare, din cauza opțiunilor de livrare, și apoi îmi pierde variabila de interogare. Măcar cred că sunt pe drumul cel bun, dar integrarea logicii mele condiționale în acest filtru pare a fi un coșmar

Problema mea aici a fost cu utilizarea variabilelor de interogare pentru a stoca o valoare care să indice că solicitarea este doar pentru ofertă. Zona de plată se reîmprospătează dinamic pe baza modificărilor din zonele de finalizare a comenzii, iar la încărcare, metodele de plată se reîncarcă, iar valorile variabilelor de interogare se pierd. Am reușit să depășesc această problemă utilizând funcțiile WC()->session->set și WC()->session->get. Am adăugat următoarele două acțiuni pentru a manipula layout-ul în funcție de valoarea sesiunii.
add_action("woocommerce_before_checkout_form", "custom_before_checkout_action");
function custom_before_checkout_action() {
if (isset($_GET["quote"]) && $_GET["quote"] == "1") {
echo '<h2>Cerere de Ofertă</h2>';
WC()->session->set("quote","true");
}
else {
WC()->session->set("quote","false");
echo '<h2>Cumpără Probă</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;
}
Această abordare pare să funcționeze pentru a păstra valoarea și pentru a adăuga logică condiționată chiar și după reîncărcarea zonei de plată.
