Я пытаюсь изменить уведомление об обратном заказе на странице корзины в 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