Egy WooCommerce webshop munkálatai során azt a feladatot kaptam, hogy tiltsak le egy bizonyos fizetési módot abban az esetben, ha a vásárló egy megadott szállítási opciót választ. Példának okáért tehát jelen esetben ha a vásárló GLS Csomagpontot választ ki, akkor a cél az, hogy ne jelenjen meg a készpénzes fizetés, mert ugye ebben az esetben ez teljesen okafogyottá válik. Marad tehát az utánvét, ami ehhez a szállítási módhoz passzoló fizetési forma.
Sajnos beépített opció nincs a fenti kérés megvalósítására, de mint ahogy szinte mindenhez, úgy ennek a kivitelezéséhez is létezik egy egyszerű és jól működő kódrészlet, amit rögtön be is mutatok.
Természetesen a megszokott módon ez is az aktív sablonunk functions.php fájljának végére kell, hogy kerüljön:
add_filter( 'woocommerce_available_payment_gateways', 'x34fg_gateway_disable_shipping' );
function x34fg_gateway_disable_shipping( $available_gateways ) {
global $woocommerce;
if ( !is_admin() ) {
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
$chosen_shipping = $chosen_methods[0];
if ( isset( $available_gateways['cheque'] ) && 0 === strpos( $chosen_shipping, 'wc_pont_shipping_method:5' ) ) {
unset( $available_gateways['cheque'] );
}
}
return $available_gateways;
}
A kód végén lévő lenti szekció a lényeges, itt szükséges csak módosításokat végrehajtanunk:
if ( isset( $available_gateways['cheque'] ) && 0 === strpos( $chosen_shipping, 'wc_pont_shipping_method:5' ) ) {
unset( $available_gateways['cheque'] );
A “cheque” helyére kerül annak a fizetési módnak az azonosítója, amit le szeretnénk tiltani. A fenti példában a “cheque” a készpénzes fizetés azonosítója. Ezt mind a két helyen át kell írnunk. Az utánvétes fizetési mód azonosítója a “cod” (mint “cash-on-delivery”), a banki átutalás pedig a “bacs” (mint “bank account clearing system”). Egyéb utólagos vagy bővítmény által hozzáadott fizetési módoknál nekünk kell kideríteni az azonosítót.
Szükséges még módosítani a szállítási módot is, amelynél ki akarjuk kapcsolni a megadott fizetési módot. Ez a fenti példában a “wc_pont_shipping_method:5”, ami a Pont plugin GLS Csomagpont szállítási módjának az ID-je. De ha ehelyett személyes átvételt szeretnénk megadni, akkor ide a “local_pickup”-ot kell írnunk, mint azonosító.
A kód tehát először is megnézi, hogy elérhető-e a megadott fizetési mód, majd ha igen, akkor ellenőrzi, hogy a vásárló kiválasztotta-e a beírt szállítási módot. Ha ez is teljesül, akkor letiltja a megadott fizetési módot a beállított szállítási mód esetén, de csak ott.