Limita cantidad de unidades de producto que un cliente puede comprar en un mismo pedido

Snippet a agregar en el child-theme en functions.php que limita la cantidad de unidades de producto que un usuario puede comprar en un mismo producto en WooCommerce.

Después de añadir el código podrás definir la cantidad de producto permitidas desde la página de edición del producto, en “Datos del producto > Inventario > Máximo de unidades permitidas”.

Y así es como se visualizará en la tienda una vez que supere las unidades permitidas:

// Limita el número máximo de unidades a nivel de producto que un cliente puede comprar en un mismo pedido
if ( in_array( 'woocommerce/woocommerce.php', get_option( 'active_plugins' ) ) ){
    
    add_action( 'woocommerce_product_options_inventory_product_data', 'enable_option_inventory_product_data_tab' );
    function enable_option_inventory_product_data_tab(){
    
        wp_nonce_field( plugin_basename(__FILE__), 'woocommerce_max_amount_nonce' );
        echo '<div class="options_group show_if_simple show_if_variable">';
    
        woocommerce_wp_text_input( array(
            'id'                => '_max_amount',
            'label'             => __( 'Máximo de unidades permitidas', 'woocommerce' ),
            'placeholder'	    => 0,
            'desc_tip'          => true,
            'description'       => __( 'Indica el número máximo de unidades permitidas que se pueden comprar de este producto en un mismo pedido. Usa el valor 0 para indicar que no hay límite de unidades.', 'woocommerce' ),
            'type'              => 'number',
            'custom_attributes' => array(
                'step' => 'any'
            )
        ) );
    
        echo '</div>';
    }
    
    add_action( 'save_post', 'save_max_amount_meta_data', 99, 2 );
    function save_max_amount_meta_data( $post_id, $post ) {
    
        /* --- security verification --- */
        if ( 'product' !== $post->post_type ) {
            		
            	return $post_id;
        }

        if( !wp_verify_nonce( $_POST['woocommerce_max_amount_nonce'], plugin_basename(__FILE__) ) ) {
            return $post_id;
        	}
    
        	if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
        		return $post_id;
        	}
    
        	if( 'product' == $_POST['post_type'] ) {
        		
        		if( !current_user_can('edit_page', $post_id) ) {
        			return $post_id;
          		}
        } else {
        
            if( !current_user_can( 'edit_page', $post_id ) ) {
                return $post_id;
            	}
        	}
        	/* - end security verification - */
    
        	if( isset( $_POST[ '_max_amount' ] ) ) {
        
        		$max_amount = $_POST[ '_max_amount' ];
        		update_post_meta( $post_id, '_max_amount', $max_amount );
        	}
    }
    
    add_action( 'woocommerce_check_cart_items', 'max_products_units_allowed' );
    function max_products_units_allowed(){
        $cart_content = WC()->cart->get_cart();
        
        foreach ( $cart_content as $key => $product ) {
    
            $max_amount = get_post_meta( $product[ 'data' ]->id, '_max_amount', true );
    
            if ( !empty( $max_amount ) && ( $max_amount < $product[ 'quantity' ] ) ) {
                
                // Resetea el número de unidades del producto al máximo permitido
                WC()->cart->set_quantity( $key, $max_amount );
    
                // Muestra el mensaje de aviso de que ha superado el número máximo de uds permitida
                $message = 'Lo sentimos. Pero el número máximo de unidades del producto "'. $product[ 'data' ]->post->post_title .'" que puedes comprar en un mismo pedido es '. $max_amount .'.<br/><br/>';
                		wc_add_notice( $message, 'error' );
            }
    
        }
    }
}