Web

Заменить уведомление о невыполнении заказа на количество невыполненных заказов для каждого элемента корзины на странице WooCommerce

Я пытаюсь изменить уведомление об обратном заказе на странице корзины в WooCommerce так, чтобы количество обратных заказов показывалось для каждого элемента корзины (я использую вариации).

Таким образом, если количество товара в корзине 7, а на складе 5, то количество заказов должно быть 2. (Эта информация по умолчанию отображается в письмах с заказами в Woocommerce, но не на странице корзины перед оформлением заказа).

Приведенный ниже код работает, пока в корзине есть только 1 товар. Но если в корзине более 1 товара, то возвращается одинаковое количество заказов для всех товаров корзины с заказами.

Кто-нибудь знает, что нужно изменить, чтобы в уведомлении об обратном заказе отображалось правильное количество обратных заказов для каждого отдельного элемента корзины, у которого есть обратные заказы, независимо от того, сколько элементов корзины с обратными заказами находится в корзине?

Я использую фильтр hook woocommerce_cart_item_backorder_notification

function backorder_info() {

    // цикл по элементам корзины

    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

        // получить объект WC_Product

        $product = $cart_item['data'];

        //Получить количество заказов

        $stock_qty = $product->get_stock_quantity();

        // получить количество элементов корзины

        $item_qty  = $cart_item['quantity'];

        // Рассчитать количество обратных заказов

        $backorder_qty = $item_qty - $stock_qty;

        $html = '<p class="backorder_notification">' .__( " " .$backorder_qty. " i restordre","woocommerce").'</p>';

        return $html;

    }   

}

 

// Отобразить уведомления об обратном заказе на странице корзины

add_filter( 'woocommerce_cart_item_backorder_notification', 'custom_cart_item_backorder_notification', 10, 2 );

 

function custom_cart_item_backorder_notification($html, $product_id) {

    $html = backorder_info();

    return $html;   

}

 

Ответ 1

Как вы видите, хук фильтра woocommerce_cart_item_backorder_notification содержит productID в качестве второго аргумента.

Только это parentID, и поэтому не так просто определить для переменных товаров, какой вариант (variantID) в данный момент находится в корзине.

Поэтому мы сначала убедимся с помощью следующего кода, что в хук фильтра woocommerce_cart_item_backorder_notification передается не parentID, а настоящий productID.

function filter_woocommerce_cart_item_product_id( $cart_item_product_id, $cart_item, $cart_item_key ) {

    // вернуть реальный productID вместо parentID

    $cart_item_product_id = $cart_item['variation_id'] > 0 ?  

    $cart_item['variation_id'] : $cart_item['product_id'];

    return $cart_item_product_id;

}

add_filter( 'woocommerce_cart_item_product_id', 'filter_woocommerce_cart_item_product_id', 10, 3 );

 

И после этого, чтобы изменить backorder_notification на основе количества обратных заказов:

function custom_cart_item_backorder_notification( $html, $product_id ) {

    // Получение количества элементов корзины

    $cart_item_quantities = WC()->cart->get_cart_item_quantities();

    // Количество продукта в корзине

    $product_qty_in_cart = isset( $cart_item_quantities[ $product_id ] ) ? $cart_item_quantities[ $product_id ] : 0;

    $product = wc_get_product( $product_id );

    // Получить количество заказов

    $stock_qty = $product->get_stock_quantity();

    // проверка на наличие

    if ( $stock_qty >= 1 ) {

        // Рассчитать количество обратных заказов

        $backorder_qty = $product_qty_in_cart - $stock_qty;     

    } else {

        // Рассчитать количество обратных заказов

        $backorder_qty = $product_qty_in_cart;          

    }

    

    // вывод

    $html = '<p class="backorder_notification">' . sprintf( __( '%s in backorder', 'woocommerce' ), $backorder_qty ) . '</p>';

    return $html;

}

add_filter( 'woocommerce_cart_item_backorder_notification', 'custom_cart_item_backorder_notification', 10, 2 );

Схожие статьи

Web

Как вставить новый элемент в массив в любую позицию на PHP

Web

Как применить метод bindValue в предложении SQL LIMIT?

Web

Отображение JSON с помощью PHP

Web

Почему событие Onclick работает, даже если форма пуста? И после нажатия на кнопку submit появляется оповещение, которое показывает, что поле ввода является обязательным