Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Monto mínimo de compra en WooCommerce, con excepción para el retiro en tienda

Preparar, embalar y despachar un pedido tiene un costo fijo. Si alguien compra un solo producto de $3.000, el envío y el tiempo de preparación pueden costarte más de lo que ganas. Un monto mínimo de compra resuelve eso.

WooCommerce no lo trae como ajuste, pero se agrega con pocas líneas.

Cómo funciona

WooCommerce revisa el carrito antes de permitir el pago mediante la acción woocommerce_check_cart_items. Si en ese momento agregamos un aviso de error, no se puede finalizar la compra hasta corregirlo. Esa acción se usa tanto en el checkout clásico como en el de bloques.

El mu-plugin

Guárdalo como wp-content/mu-plugins/cwp-minimo.php:

<?php
/**
 * Plugin Name: Monto mínimo de compra (Curso WordPress)
 */

const CWP_MINIMO = 15000; // En pesos, sobre el subtotal con IVA.

add_action( 'woocommerce_check_cart_items', function () {
	if ( ! WC()->cart || WC()->cart->is_empty() ) {
		return;
	}

	// Excepción 1: retiro en tienda.
	$metodos = WC()->session ? (array) WC()->session->get( 'chosen_shipping_methods' ) : array();
	foreach ( $metodos as $metodo ) {
		if ( 0 === strpos( (string) $metodo, 'local_pickup' ) || 0 === strpos( (string) $metodo, 'pickup_location' ) ) {
			return;
		}
	}

	// Excepción 2: clientes mayoristas u otro rol.
	if ( current_user_can( 'cwp_sin_minimo' ) ) {
		return;
	}

	$subtotal = (float) WC()->cart->get_subtotal() + (float) WC()->cart->get_subtotal_tax();
	if ( $subtotal < CWP_MINIMO ) {
		wc_add_notice(
			sprintf(
				'El monto mínimo para despacho es %1$s. Tu carrito suma %2$s: te faltan %3$s. Si retiras en tienda, no hay mínimo.',
				wc_price( CWP_MINIMO ),
				wc_price( $subtotal ),
				wc_price( CWP_MINIMO - $subtotal )
			),
			'error'
		);
	}
} );

Qué hace:

  • Calcula el subtotal con IVA (sin el costo de envío): lo que la persona ve como suma de productos.
  • Si no llega al mínimo, muestra un aviso con cuánto falta, que es mucho más útil que un simple «no alcanza el mínimo».
  • Si eligió retiro en tienda, no aplica el mínimo. El código reconoce el método clásico (local_pickup) y el retiro del checkout de bloques (pickup_location).
  • Si el usuario tiene el permiso cwp_sin_minimo, tampoco aplica.

Para darle ese permiso a un rol (por ejemplo, un rol de clientes mayoristas que creaste), usa WP-CLI: wp cap add mayorista cwp_sin_minimo.

¿Contar los descuentos?

Si quieres que el mínimo se calcule después de aplicar cupones, resta el descuento:

$subtotal = (float) WC()->cart->get_subtotal() + (float) WC()->cart->get_subtotal_tax()
	- (float) WC()->cart->get_discount_total() - (float) WC()->cart->get_discount_tax();

Pruébalo en los dos checkouts

  1. Agrega un producto barato al carrito: debe aparecer el aviso y no debe dejarte pagar.
  2. Cambia a retiro en tienda: el aviso debe desaparecer al actualizar.
  3. Agrega productos hasta pasar el mínimo: debe permitir el pago.
  4. Haz la prueba con el checkout de bloques y con el clásico, si alguna vez cambias de uno a otro.

El aviso aparece en el checkout, cuando la persona ya decidió comprar. Para no frustrarla, avisa del mínimo antes: en la ficha del producto, en el carrito o en una barra superior («Despacho desde $15.000»). Un mínimo sorpresa en el último paso hace que muchas personas abandonen.

Una alternativa más amable

En vez de impedir la compra, puedes cobrar un recargo por pedido pequeño: el pedido se permite, pero con un costo extra de preparación. Se hace con una tarifa en el método de envío (por ejemplo, envío gratis desde cierto monto y una tarifa mayor bajo ese monto), lo que vimos en la guía de envíos.

¿Tienes un monto mínimo en tu tienda? Cuéntanos en el foro cuál usas y si notaste cambios en el ticket promedio.