Пользовательское уведомление на основе количества товара в Woocommerce - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь создать функцию для WordPress / WooCommerce, чтобы показать опцию на странице корзины для разделения доставки.

Что нужно сделать, это проверить наличие на складе всех товаров в корзине.

Первый случай: Если все товаров в корзине доступны, ничего не выводить.

Второй случай: Если всех товаров в корзине нет в наличии, ничего не выводится.

Третий случай: Единственное условие, когда что-то должно быть показано, - это когда происходят оба случая (первый и второй).

Таким образом, только если в корзине есть товары на складе И имеет товары на складе, на них должно отображаться уведомление.

Предыдущая версия, кажется, была неправильной. Итак, вот мой новый подход с другим кодом.

в functions.php:

add_action( 'woocommerce_after_cart_table', 'split_devliery_notification' );        
function split_devliery_notification() {
    $all_items_in_stock = true; // initializing
    $all_items_out_of_stock = true;

    // Iterating through cart items (to get the stock info)
    foreach (WC()->cart->get_cart() as $cart_item) {

        # HANDLING SIMPLE AND VARIABLE PRODUCTS

        // Variable products
        $variation_id = $cart_item['variation_id'];
        if( 0 != $variation_id) {
            $variation_obj = new WC_Product_variation($variation_id);
            $stock = $variation_obj->get_stock_quantity();
        } else {
            // Simple products
            $product_id = $cart_item['product_id'];
            $product_obj = new WC_Product($product_id);
            $stock = $product_obj->get_stock_quantity();
        }

        if( $stock <= 0 ){
            // if an item is out of stock
            $all_items_in_stock = false;
            break; // We break the loop
        }
        elseif ( $stock >= 0 ) {
            $all_items_out_of_stock = false;
            break;
        }

    }

    // All items "in stock"
    if( $all_items_in_stock ) {
        echo 'All items in cart are in stock';
    } 
    elseif ( $all_items_out_of_stock ) {
        echo 'All items in cart are out of stock';
    }
    else {
        echo 'Some items in cart are in stock and some are out of stock -> Show notification ON!';
    }

}

Эта функция работает для двух случаев:

  1. Если все товары в корзине в наличии , это подтверждает правильное сообщение (Все товары в корзине есть в наличии ).
  2. Если все товары в корзине нет в наличии указывает на правильное сообщение (Все товары в корзине отсутствуют).

Но если в корзине есть товары на складе И товаров на складе, это повторяет первое сообщение (Все товары в корзине есть в наличии).

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Хотя решение @LoicTheAztec работает идеально и кодируется действительно четко, хорошо и элегантно, я также разработал собственное решение.Я также опубликую это здесь, просто чтобы показать два разных подхода к проблеме.

add_action( 'woocommerce_after_cart_contents', 'split_devliery_notification' );        
function split_devliery_notification() {
$all_items_in_stock = true; // initializing a true statement at beginning to be proved
$all_items_out_of_stock = true;

// Iterating through cart items (to get the stock info)
foreach (WC()->cart->get_cart() as $cart_item) {

    # HANDLING SIMPLE AND VARIABLE PRODUCTS

    // Variable products
    $variation_id = $cart_item['variation_id'];
    if( 0 != $variation_id) {
        $variation_obj = new WC_Product_variation($variation_id);
        $stock = $variation_obj->get_stock_quantity();
    } else {
        // Simple products
        $product_id = $cart_item['product_id'];
        $product_obj = new WC_Product($product_id);
        $stock = $product_obj->get_stock_quantity();
    }

    if ( $stock <= 0 ){
        // if an item is out of stock
        $all_items_in_stock = false;
        break; // We break the loop
    }
}    
            // Continue with iterating if first iterating was stopped because one item has stock status below 0
            foreach (WC()->cart->get_cart() as $cart_item) {

                # HANDLING SIMPLE AND VARIABLE PRODUCTS

                // Variable products
                $variation_id = $cart_item['variation_id'];
                if( 0 != $variation_id) {
                    $variation_obj = new WC_Product_variation($variation_id);
                    $stock = $variation_obj->get_stock_quantity();
                } else {
                    // Simple products
                    $product_id = $cart_item['product_id'];
                    $product_obj = new WC_Product($product_id);
                    $stock = $product_obj->get_stock_quantity();
                }
                // check if stock status is 0 or above. If not it is proven that there are both types in cart
                if ( $stock >= 0 ) {
                    $all_items_out_of_stock = false;
                    break;
                }  
            }

// All items "in stock"
if( $all_items_in_stock ) {
// commented out to prevent displaying a message in that case
//        echo 'All items in cart are in stock'; 
} 
elseif ( $all_items_out_of_stock ) {
// commented out to prevent displaying a message in that case
//        echo 'All items in cart are out of stock';
}
else {
    ?>
        <div class="split-delivery-notification-container">
            <div class="split-delivery-notification-text">
                Delivery notification ON.
            </div>
        </div>
    <?php
     }

}

это идет в functions.php

0 голосов
/ 12 сентября 2018

Я повторно посетил ваш код. Для элементов корзины $cart_item['data']; - это необходимый объект WC_Product, поэтому код будет гораздо более компактным.

Приведенный ниже код будет отображать пользовательское уведомление, когда есть смешанные запасы для товаров в корзине, которые есть в наличии и нет в наличии одновременно.
Первая функция - это условная функция, которая проверяет элементы корзины.
Вторая функция использует первую функцию для условного отображения пользовательского уведомления.

// Conditional function: Checking cart items stock
function is_mixed_stock_items(){
    $enough_stock = $out_of_stock = false; // initializing

    // Loop through cart items
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // Get an instance of the WC_Product Object
        $product = $cart_item['data'];
        // Get stock quantity
        $stock_qty = $product->get_stock_quantity();
        // get cart item quantity
        $item_qty  = $cart_item['quantity'];

        if( ( $stock_qty - $item_qty ) >= 0 ){
            $enough_stock = true; // enough stock
        } else {
            $out_of_stock = true; // not enough stock
        }
    }
    // return true if stock is mixed and false if not
    return $enough_stock && $out_of_stock ? true : false;
}

// Display a custom notice
add_action( 'woocommerce_after_cart_table', 'display_delivery_notification' );
function display_delivery_notification() {
    if( is_mixed_stock_items() ){
        $message = __("Some items in cart are in stock and some others out of stock -> Show notification ON!");
        wc_print_notice( $message, 'notice');
    }
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

При необходимости вы можете использовать условную функцию, которая проверяет запас товаров в корзине в разных крючках

Похожие: Получить в корзине WooCommerce идентификатор продукта корзины

...