Permitir apenas um produto por categoria de produto no carrinho

Nesta pergunta / resposta , encontrei o código PHP sobre como adicionar apenas um produto por categoria no carrinho na Woocommerce.

O código funciona muito bem, mas eu quero adicionar o último produto adicionado ao carrinho e, se já houver um produto dessa categoria no carrinho, quero que o mais antigo seja excluído.

add_filter( 'woocommerce_add_to_cart_validation', 'custom_checking_product_added_to_cart', 10, 3 ); function custom_checking_product_added_to_cart( $passed, $product_id, $quantity) { // HERE Type your alert displayed message // $message = __( 'BLA BLA YOUR MESSAGE.', 'woocommerce' ); $product_cats_object = get_the_terms( $product_id, 'product_cat' ); foreach($product_cats_object as $obj_prod_cat){ $product_cats[] = $obj_prod_cat->slug; } foreach (WC()->cart->get_cart() as $cart_item ){ if( has_term( $product_cats, 'product_cat', $cart_item['product_id'] )) { $passed = false; wc_add_notice( $message, 'error' ); break; } } return $passed; } 

É um código que vem do LoicTheAztec . Funciona bem, mas preciso de uma opção extra …

No meu Woocommerce existem 5 categorias diferentes, há apenas um lugar no carrinho para um item por categoria. O último item adicionado deve permanecer, o item da mesma categoria que já está no carrinho deve ser removido do carrinho. Alguém de vocês tem uma solução?

Muito Obrigado!

Aqui está a sua paz de código que irá remover um item do carrinho que corresponde a categoria de produto com a categoria de produto atual.

 add_filter( 'woocommerce_add_to_cart_validation', 'custom_checking_product_added_to_cart', 10, 3 ); function custom_checking_product_added_to_cart( $passed, $product_id, $quantity) { // Getting the product categories slugs in an array for the current product $product_cats_object = get_the_terms( $product_id, 'product_cat' ); foreach($product_cats_object as $obj_prod_cat) $product_cats[] = $obj_prod_cat->slug; // Iterating through each cart item foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ){ // When the product category of the current product match with a cart item if( has_term( $product_cats, 'product_cat', $cart_item['product_id'] )) { // Removing the cart item WC()->cart->remove_cart_item($cart_item_key); // Displaying a message wc_add_notice( 'Only one product from a category is allowed in cart', 'notice' ); // We stop the loop break; } } return $passed; } 

Este código vai no arquivo function.php do seu tema ativo (ou tema) ou também em qualquer arquivo de plugin.

Este código é testado e funciona para o WooCommerce versão 2.6+ e 3.0+