I’m trying to add a filter when a customer adds a product to the cart, to allow it or not.
We just need to compare one attribute of the WooCommerce products.
- If cart is empty : Add to cart ok
- If cart has 1 or more items : check Attribute XXX value of products
- If Attribute value is the same : Add to cart ok
- If Attribute value is different : Add to cart denied and message will display
I have this code so far, but it doesn’t work well at all, and I’m unsure why?
// Check Products added to cart for same vendor function so_validate_add_cart_item( $passed, $product_id ) { global $woocommerce; $items = $woocommerce->cart->get_cart(); foreach($items as $item => $values) { $_product = wc_get_product( $values['data']->get_id()); $prod1_vendeur[] = $_product->get_attribute( 'pa_vendeur' ); } $newproduct = wc_get_product( $product_id ); $prod2_vendeur = $newproduct->get_attribute( 'pa_vendeur' ); if (isset($prod1_vendeur )) { if ( $prod1_vendeur[0] != $prod2_vendeur ) { $passed = false; wc_add_notice( 'Error message' , 'notice' ); } } return $passed; } add_filter( 'woocommerce_add_to_cart_validation', 'so_validate_add_cart_item', 10, 5 );
Any help is more than appreciated.
Advertisement
Answer
- While you specify that the
woocommerce_add_to_cart_validation
hook contains 5 arguments, you pass only 2 global $woocommerce;
is not necessary, useWC()
instead
So you get:
function filter_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) { // Setting $attribute = 'pa_vendeur'; // Real product ID $product_id = $variation_id > 0 ? $variation_id : $product_id; // Get product $product = wc_get_product( $product_id ); // Get the product attribute value $product_attribute = $product->get_attribute( $attribute ); // Initialize $flag = false; // WC Cart if ( WC()->cart ) { // Get cart $cart = WC()->cart; // If cart is NOT empty if ( ! $cart->is_empty() ) { // Loop through cart items foreach( $cart->get_cart() as $cart_item ) { // Get the product attribute value $cart_item_attribute = $cart_item['data']->get_attribute( $attribute ); // NOT equal if ( $cart_item_attribute != $product_attribute ) { // Flag becomes true $flag = true; // Break loop break; } } } } // True if ( $flag ) { // Display an error message wc_add_notice( __( 'My custom error message', 'woocommerce' ), 'error' ); $passed = false; } return $passed; } add_filter( 'woocommerce_add_to_cart_validation', 'filter_woocommerce_add_to_cart_validation', 10, 5 );