У меня есть функция, которая работает правильно, за исключением того, что она дважды отображает уведомление в корзине, а не один раз. Функция применяет скидку и также показывает уведомление. Функция ищет элементы определенной категории, которая добавляет общую сумму, и если она соответствует сумме скидок, она применяет скидку и показывает уведомление. Прямо сейчас, даже если в корзине есть только один предмет, он дважды показывает уведомление.
Я пробовал добавить wc_clear_notices()
но это очистит другие уведомления, которые мне нужны, как минимальные уведомления для минимальных количеств заказов по категориям. Если я добавлю в wc_clear_notices()
в начале функции или в любом из операторов foreach, она очистит другое уведомление min / max, пока оно не покажет.
Вот несколько вопросов, на которые я уже посмотрел, но просто скажу, чтобы использовать wc_clear_notices()
который не работает, потому что другие уведомления очищаются:
Уведомление WooCommerce, выполняется только один раз
Показать wc_add_notice только один раз
Вот код, который у меня сейчас есть, который правильно делит пункты и отображает уведомления, но отображает уведомления дважды, а не один раз:
//apply discounts to foil and seal product categories add_action( 'woocommerce_before_calculate_totals', 'cart_count_foil_seal_items',10,1); function cart_count_foil_seal_items( $cart_object ) { $seal_prod_tally = 0; $foil_prod_tally = 0; // Iterating through each item in cart foreach ( $cart_object->get_cart() as $item_values ) { // Get cart item data $item_id = $item_values['data']->get_id(); // Product ID $item_qty = $item_values['quantity']; // Item quantity // Getting the object $product = new WC_Product( $item_id ); $prod_cat = wp_get_post_terms($product->get_id(),'product_cat',array('fields'=>'slugs')); //tally total if (in_array('seal-stickers', $prod_cat)){ $seal_prod_tally += $item_qty; }else if(in_array('foil-badges', $prod_cat)){ $foil_prod_tally += $item_qty; } } foreach ( $cart_object->get_cart() as $item_values ) { //Get cart item data $item_id = $item_values['data']->get_id(); // Product ID $item_qty = $item_values['quantity']; // Item quantity // Getting the object $product = new WC_Product( $item_id ); $prod_cat2 = wp_get_post_terms($product->get_id(),'product_cat',array('fields'=>'slugs')); //apply discount to each item within category if (in_array('seal-stickers',$prod_cat2)){ switch ($seal_prod_tally){ case 20000: $item_values['data']->set_price(1327.01/20000); if(!is_checkout()){ wc_add_notice( sprintf( 'Quantity discount has been applied to item %s: 20,000 at $1327.01.', $item_values['data']->get_title() ), 'notice' ); } break; case 30000: $item_values['data']->set_price(1578.65/30000); if(!is_checkout()){ wc_add_notice( sprintf( 'Quantity discount has been applied to item %s: 30,000 at $1578.65.', $item_values['data']->get_title() ), 'notice' ); } break; case 40000: $item_values['data']->set_price(1853.05/40000); if(!is_checkout()){ wc_add_notice( sprintf( 'Quantity discount has been applied to item %s: 40,000 at $1853.05.', $item_values['data']->get_title() ), 'notice' ); } break; case 50000: $item_values['data']->set_price(2126.76/50000); if(!is_checkout()){ wc_add_notice( sprintf( 'Quantity discount has been applied to item %s: 50,000 at $2126.76.', $item_values['data']->get_title() ), 'notice' ); } break; case 60000: $item_values['data']->set_price(2405.98/60000); if(!is_checkout()){ wc_add_notice( sprintf( 'Quantity discount has been applied to item %s: 60,000 at $2405.98.', $item_values['data']->get_title() ), 'notice' ); } break; default: break; } }else if (in_array( 'foil-badges',$prod_cat2)){ switch ($foil_prod_tally){ case 25000: $item_values['data']->set_price(5872.63/25000); if(!is_checkout()){ wc_add_notice( sprintf( 'Quantity discount has been applied to item %s: 25,000 at $5872.63.', $item_values['data']->get_title() ), 'notice' ); } break; case 50000: $item_values['data']->set_price(10815.47/50000); if(!is_checkout()){ wc_add_notice( sprintf( 'Quantity discount has been applied to item %s: 50,000 at $10815.47.', $item_values['data']->get_title() ), 'notice' ); } break; default: break; } } } }
Многократные уведомления были вызваны, когда клиент обновил корзину с помощью кнопки «Обновить корзину», поэтому быстрое исправление просто очищало уведомления каждый раз, когда клиент нажал кнопку «Обновить корзину».
Было бы лучше решить проблему в ее источнике, которая будет искать другой способ отображения уведомлений без дублирования, но до тех пор это получает желаемый эффект.
//clear notices on cart update function clear_notices_on_cart_update() { wc_clear_notices(); }; // add the filter add_filter( 'woocommerce_update_cart_action_cart_updated', 'clear_notices_on_cart_update', 10, 1 );