fbpx

Limitar la compra de productos por categoría en WooCommerce

En algunas ocasiones es necesario limitar la compra de productos por categoría en WooCommerce. Conoce como hacerlo de forma fácil y rápida.

Si en tu tienda online tienes productos de varios proveedores en una misma categoría, en los que por temas de precios, descuentos o transporte no quieres mezclar pedidos entre ellos, el siguiente código te permitirá limitar la venta de productos a una única o varias categorías por pedido.

Por lo tanto, al aplicarlo en tu plugin de funciones, si un usuario intenta hacer una compra con distintos productos de la misma categoría, le aparecerá el mensaje Sólo está permitido 1 producto de esta categoría en el carrito. y el producto no llegará a añadirse al carrito.

¿Cómo limitar la compra de productos de una única categoría en WooCommerce?

Para activar la restricción de un número de productos por categoría en tu instalación de WooCommerce sólo tienes que añadir el siguiente código en tu plugin de funciones:

Mensaje de advertencia notificando que sólo se puede comprar un único producto de esa categoría por pedido
Mensaje de advertencia que notifica que sólo se puede comprar un único producto de dicha categoría de producto por pedido.
// Permite sólo un producto (o un número predefinido de productos) por categoría en el carrito
add_filter( 'woocommerce_add_to_cart_validation', 'mk_cantidad_permitida_por_categoria_en_carrito', 10, 2 );
function mk_cantidad_permitida_por_categoria_en_carrito( $passed, $product_id) {

    $max_num_products = 1;// cambia el número máximo de productos permitidos por categoría
    $running_qty = 0;

    $restricted_product_cats = array();

    //Restringe a categoría o categorías particulares por slug
    $restricted_product_cats[] = 'cat-slug-one';
    //$restricted_product_cats[] = 'cat-slug-two';// descomenta para activar la restricción en una segunda categoría

    // Obtiene el slug de la categoría de producto actual en un array
    $product_cats_object = get_the_terms( $product_id, 'product_cat' );
    foreach($product_cats_object as $obj_prod_cat) $current_product_cats[]=$obj_prod_cat->slug;

    // Itera a través de cada artículo del carrito
    foreach (WC()->cart->get_cart() as $cart_item_key=>$cart_item ){

    	// Restringe el $max_num_products de cada categoría
        if( has_term( $current_product_cats, 'product_cat', $cart_item['product_id'] )) {

        // Restringe el $max_num_products de categorías con productos restringidos
        //if( array_intersect($restricted_product_cats, $current_product_cats) && has_term( $restricted_product_cats, 'product_cat', $cart_item['product_id'] )) {

        	// count(selected category) quantity
            $running_qty += (int) $cart_item['quantity'];

            // No se permiten más de los productos permitidos en el carrito
            if( $running_qty >= $max_num_products ) {
                wc_add_notice( sprintf( 'Sólo está permitido %s '.($max_num_products>1?'productos de esta categoría':'producto de esta categoría').' en el carrito.',  $max_num_products ), 'error' );
                $passed = false; // no agrega el nuevo producto al carrito
                // Para el loop
                break;
          	}

        }
    }
    return $passed;
}

Personalización del snippet

Como puedes comprobar, una vez aplicado el cambio, la cantidad máxima de productos de una misma categoría se corresponde con la que definas en la línea $max_num_products = 1;. Siendo este «1» la cantidad máxima de productos permitida para una misma categoría.

Por lo tanto, si quieres que sean 2, 3 o la cantidad que prefieras, sólo tienes que cambiar el valor por el número que quieras. Por ejemplo: $max_num_products = 2;.

Del mismo modo, también puedes hacer que la restricción se aplique a una categoría o varias. Imagina que tienes varias categorías con productos de distintos proveedores de los que no quieres que se mezclen en un mismo pedido. Es decir, sólo quieres que haya un producto por categoría y proveedor. ¡Muy fácil!

Sólo tienes que indicar a qué categorías quieres aplicar esta restricción a través de la línea $restricted_product_cats[] = ‘cat-slug-one’;, incluyendo el slug de la categoría que quieres restringir.

Y si quieres restringir una segunda categoría, sólo tienes que descomentar la línea $restricted_product_cats[] = ‘cat-slug-two’; e indicar el slug de la segunda categoría.

¡Así de simple y así de fácil!

Si te ha gustado este tutorial, recuerda que si te suscribes, tendrás acceso a todo el contenido premium.

Y como siempre, si tienes cualquier problema, no dudes en contactar conmigo. Nos vemos en la próxima entrega, con un nuevo tutorial. 😉

Author avatar
Ángel Martín
Ayudo a emprendedores y empresas a digitalizar su negocio y sus procesos optimizando sus costes.