Fizetési módok szűrése a kosárban lévő elemek készlete szerint előnézeti képe

Fizetési módok szűrése a kosárban lévő elemek készlete szerint

| Olvasási idő: 1 perc

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.

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: 

php
<?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á a woocommerce_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!