
Evitar que un cliente compre más de una vez un producto en WooCommerce
En algunas tiendas WooCommerce, especialmente si vendes productos únicos como licencias, membresías o productos digitales con acceso limitado, puede ser necesario restringir que un cliente vuelva a comprar el mismo producto. En este artículo te enseñamos cómo hacerlo usando pequeños snippets de código y buenas prácticas.
Requisito clave: Para poder restringir la compra por cliente, es necesario que los usuarios estén logueados. Si aún no fuerzas el inicio de sesión en tu tienda, aquí te mostramos cómo hacerlo.
Forzar el inicio de sesión antes de comprar
WooCommerce, por defecto, permite realizar compras como invitado. Para desactivar esto:
- Ve a: WooCommerce > Ajustes > Cuentas y privacidad
- Y desactiva las siguientes opciones:
- Permitir a los clientes realizar pedidos sin una cuenta.
- Permitir a los clientes crear una cuenta durante el pago (opcional, dependiendo de tu flujo).
O bien, puedes forzar el inicio de sesión con el siguiente snippet:
<?php add_action( 'template_redirect', function() { if ( ! is_user_logged_in() && is_product() ) { wp_redirect( wp_login_url( get_permalink() ) ); exit; } } );
Este código redirige automáticamente a la página de login si el usuario intenta acceder a un producto sin estar autenticado.
Ocultar el botón «Añadir al carrito» si ya compró el producto
Una solución sencilla y visual: ocultar el botón de compra para productos que el usuario ya adquirió.
<?php add_filter( 'woocommerce_is_purchasable', 'hideAddToCartIfPurchased', 10, 2 ); function hideAddToCartIfPurchased( $purchasable, $product ) { if ( is_user_logged_in() && hasUserPurchasedProduct( get_current_user_id(), $product->get_id() ) ) { return false; } return $purchasable; } function hasUserPurchasedProduct( $userId, $productId ) { $orders = wc_get_orders( [ 'customer_id' => $userId, 'status' => [ 'completed', 'processing' ] ] ); foreach ( $orders as $order ) { foreach ( $order->get_items() as $item ) { if ( $item->get_product_id() == $productId ) { return true; } } } return false; }
Con esto, si el cliente ya compró el producto, no podrá volver a añadirlo al carrito.
Prevenir el agregado al carrito y mostrar mensaje
Si prefieres bloquear la acción de añadir el producto y mostrar un mensaje personalizado, puedes usar:
<?php add_filter( 'woocommerce_add_to_cart_validation', 'preventDuplicateProductPurchase', 10, 3 ); function preventDuplicateProductPurchase( $passed, $productId, $quantity ) { if ( is_user_logged_in() && hasUserPurchasedProduct( get_current_user_id(), $productId ) ) { wc_add_notice( __( 'Ya has comprado este producto. No puedes volver a adquirirlo.' ), 'error' ); return false; } return $passed; }
Esto evita que el producto se agregue al carrito y muestra un mensaje de error.
Mostrar un aviso encima del producto
También puedes agregar un mensaje visible en la página del producto, avisando que ya fue comprado:
<?php add_action( 'woocommerce_before_single_product', 'showNoticeIfProductPurchased' ); function showNoticeIfProductPurchased() { global $product; if ( is_user_logged_in() && hasUserPurchasedProduct( get_current_user_id(), $product->get_id() ) ) { echo '<div class="woocommerce-message">Ya has adquirido este producto. No es posible volver a comprarlo.</div>'; } }
Esto mostrará un mensaje informativo en la parte superior del producto.
Con estos pequeños snippets puedes mejorar significativamente la experiencia de compra y evitar problemas con compras duplicadas, especialmente útiles si estás vendiendo productos únicos como plugins con licencia o membresías.