Csapjunk is a lecsóba, kezdjünk azzal, hogy létrehozunk az mu-plugins mappában egy fájlt disable-cod-if-product-in-cart-is-not-in-stock.php
néven, az alábbi tartalommal:

Fizetési módok szűrése a kosárban lévő elemek készlete szerint
Ha azt szeretnéd, hogy az olyan termékeknél, amelyek nincsenek ugyan készleten, de rendelhetőek, a checkout során ne jelenjen meg az utánvét, mint fizetési mód, akkor ez a snippet neked szól.
<?php
/*
Plugin Name: Disable COD if product in cart is not in stock
Plugin URI: https://www.webmenedzser.hu
Description: Disable COD if product in cart is not in stock
Version: 1.0
Author: Radics Ottó
Author URI: https://www.webmenedzser.hu
License: GPLv3
*/
/**
* Function checks if the products in cart are in stock or not. If they are not,
* the loop is broke, and it returns with `false`;
*
* @return bool
*/
function check_products_in_cart_if_in_stock() : bool {
$products_in_stock = true;
$cart_contents = WC()->cart->get_cart_contents();
foreach ($cart_contents as $cart_content) {
$product = $cart_content['data'];
if ($product->get_manage_stock()) {
$stock_quantity = $product->get_stock_quantity();
if (!$stock_quantity) {
$products_in_stock = false;
break;
}
}
}
return $products_in_stock;
}
/**
* Disable Cash on Delivery if conditions are met.
*
* @param $available_gateways
* @return array
*/
function disable_cod_if_product_is_out_of_stock($available_gateways) : array {
if (!check_products_in_cart_if_in_stock() && isset( $available_gateways['cod'] )) {
unset( $available_gateways['cod'] );
}
return $available_gateways;
}
add_action('woocommerce_available_payment_gateways', 'disable_cod_if_product_is_out_of_stock');
Két függvényünk van:
- Az első (
check_products_in_cart_if_in_stock()
) végzi el a vásárló kosarának ellenőrzését: végigmegy minden terméken, megvizsgálja mindegyiket, hogy van-e az adott termékkel kapcsolatban készletkezelés, és ha van, akkor megnézi, hogy van-e még raktáron az adott termékből - ha nincs, akkor a feltételvizsgálat igazra értékelődik ki, egyúttal átállítjuk a visszatérési értéket hamisra, és azonnal meg is szakítjuk a kosár vizsgálatát, hiszen elég, ha csak egy nincs raktáron. - A másodikat (
disable_cod_if_product_is_out_of_stock($available_gateways)
) kötjük hozzá awoocommerce_available_payment_gateways
hook-hoz - ez annyit tesz, hogy megnézi, milyen értékű az első függvény ellentettje, és be van-e állítva az utánvét rendelési módnak. Ha igen, akkor kiveszi az elérhető módok közül, majd visszaadja ezt a tömböt a WooCommerce-nek a további munkához.
Ha másik fizetési módot szeretnél szűrni, akkor csak cseréld a fenti, második függvényben a cod
-ot a kivenni szándékozott fizetési mód handle-jére.
Megjegyzés: a függvények szignatúráját követő : array
és : bool
egy-egy hint arra vonatkozóan, hogy milyen típusú értékkel fog visszatérni az adott függvény. Ezt használva az olyan IDE-k, mint pl. a PhpStorm, menő leírást tudnak generálni hozzá, mint amit ebben a snippetben is látsz.
Kis Krisztiánnak ezúton is köszönöm a témát!