
Cómo eliminar el botón de añadir al carrito en WooCommerce
El botón «Añadir al carrito» es el mecanismo fundamental en WooCommerce que mantiene su tienda en funcionamiento. Pero fundamental no significa siempre apropiado. Un sitio de escaparate sin capacidad de pedido, un producto por encargo que requiere un precio individual, un artículo agotado que aún no debe dejar de publicarse: en todos estos casos, el botón estándar de Añadir al carrito solo estorba.
Podría tomar el enfoque drástico y establecer el estado del producto como «oculto», pero entonces desaparece del catálogo y deja de indexarse. Una solución mucho más limpia es mantener visible la ficha del producto mientras se elimina o reemplaza el botón de compra. WooCommerce proporciona varios hooks y filtros para esto, desde la desactivación global hasta la ocultación precisa en un solo producto.
A continuación encontrará todos los métodos funcionales, del más simple al más avanzado. Cada uno ha sido probado en la versión actual de WooCommerce.
💡 Resumen rápido:
- Sitio completo de una vez: dos llamadas a
remove_actionenfunctions.php, una para la cuadrícula de productos y otra para la página de producto - Página de inicio y archivos: filtro condicional
woocommerce_is_purchasableusandois_shop() - Todas las categorías o una categoría específica: el mismo filtro con
is_product_category()ois_product_category('slug') - Producto individual: tres métodos, interruptor nativo del administrador, poner el stock a cero, filtro por
product_id - Para quienes necesitan un botón: reemplácelo con texto personalizado o un botón «Solicitar presupuesto»
1. Eliminar el botón de todo el sitio
Si su tienda funciona únicamente como escaparate sin intención de compra, el enfoque más simple es eliminar el botón globalmente usando dos hooks en el functions.php de su tema activo.
El primer hook gestiona las fichas de producto en la cuadrícula (el shortcode [products], página de tienda, categorías), mientras que el segundo gestiona las páginas de producto individuales:
1 // Remove button from card grid 2 remove_action( 3 'woocommerce_after_shop_loop_item', 4 'woocommerce_template_loop_add_to_cart' 5 ); 6 7 // Remove button from product page 8 remove_action( 9 'woocommerce_single_product_summary', 10 'woocommerce_template_single_add_to_cart', 11 30 12 );
Es mejor colocar este código no directamente en el functions.php de su tema (lo que arriesga a perder los cambios al actualizar), sino mediante el plugin Code Snippets o un tema hijo. Antes de realizar cualquier edición, cree una copia de seguridad; sin ella no tendrá a dónde volver atrás.
2. Ocultar el botón en la página de inicio y en las páginas de archivo
La desactivación global no funciona para todos. Un escenario común: el botón debe permanecer en la página de producto pero desaparecer del catálogo y de la página de inicio (donde los productos se muestran como lista).
Aquí, en lugar de remove_action, es mejor usar el filtro woocommerce_is_purchasable con una comprobación condicional is_shop():
1 function ts_hide_cart_on_shop() { 2 if ( is_shop() || is_front_page() ) { 3 add_filter( 'woocommerce_is_purchasable', '__return_false' ); 4 } 5 } 6 add_action( 'wp', 'ts_hide_cart_on_shop' );
El hook wp se ejecuta temprano, antes del renderizado, y evita comprobaciones repetidas que ralentizarían la página. is_shop() cubre la página principal de la tienda, e is_front_page() cubre una página de inicio estática si muestra un shortcode de WooCommerce. El filtro no se aplica a las páginas de producto, por lo que la compra funciona normalmente allí.
3. Eliminar el botón de todas las páginas de categoría
Mismo principio, pero reemplace is_shop() por is_product_category() sin parámetro. El filtro capturará cualquier categoría de producto:
1 function ts_hide_cart_in_categories() { 2 if ( is_product_category() ) { 3 add_filter( 'woocommerce_is_purchasable', '__return_false' ); 4 } 5 } 6 add_action( 'wp', 'ts_hide_cart_in_categories' );
El botón permanece en las páginas de producto individuales. Esto es útil cuando el catálogo sirve como escaparate y la compra solo está disponible tras navegar a la ficha de producto, por ejemplo, para que los usuarios lean primero la descripción y las especificaciones.
4. Desactivar el botón para una sola categoría
A veces una categoría de su tienda es por encargo mientras que el resto son estándar. En ese caso necesita un bloqueo dirigido por slug de categoría:
1 function ts_hide_cart_for_category() { 2 if ( is_product_category( 'pod-zakaz' ) ) { 3 add_filter( 'woocommerce_is_purchasable', '__return_false' ); 4 } 5 } 6 add_action( 'wp', 'ts_hide_cart_for_category' );
Reemplace 'pod-zakaz' con el slug real de su categoría objetivo. Puede encontrar el slug en el panel de administración en «Productos → Categorías» en la columna «Slug». El filtro desactiva silenciosamente la compra para todos los productos de la categoría; el botón también desaparecerá en la página de producto porque WooCommerce verifica is_purchasable() allí también.
5. Ocultar el botón para un producto específico
El escenario más común: un producto entre cientos necesita mostrarse temporalmente sin la posibilidad de pedido. WooCommerce ofrece tres maneras de hacerlo.
Método 1: interruptor nativo del administrador
Vaya a editar el producto, abra la pestaña «Inventario» y cambie «Estado de existencias» a «Agotado». Establezca la casilla «¿Permitir pedidos pendientes?» en «No permitir». Guarde el producto y el botón de Añadir al carrito desaparecerá automáticamente.

Este enfoque no requiere código y funciona de inmediato. La desventaja es que el producto se marca como «Agotado», lo cual no siempre es deseable (por ejemplo, para productos digitales o servicios donde el concepto de «existencias» no tiene sentido).
Método 2: poner la cantidad de existencias a cero
En la misma pestaña «Inventario», desmarque «¿Gestionar existencias?» o establezca la cantidad en 0. El botón desaparecerá cuando las existencias restantes lleguen a cero.

Este método funciona bien para productos físicos: tan pronto como se vende la última unidad, el botón desaparece por sí solo. Sin embargo, como el primer método, el producto obtiene un estado de agotado.
Método 3: filtro por ID de producto
Si necesita eliminar el botón sin cambiar el estado «En existencias», use un filtro que verifique el ID:
1 function ts_disable_cart_for_product( $purchasable, $product ) { 2 $target_ids = array( 22, 47, 103 ); // Product IDs for which we remove the button 3 if ( in_array( $product->get_id(), $target_ids ) ) { 4 return false; 5 } 6 return $purchasable; 7 } 8 add_filter( 'woocommerce_is_purchasable', 'ts_disable_cart_for_product', 10, 2 );
Esto es lo que sucede: el filtro woocommerce_is_purchasable recibe el estado actual $purchasable y el objeto $product. Si $product->get_id() coincide con uno de los IDs en el array $target_ids, devuelve false y el botón se suprime. Para todos los demás productos se devuelve el estado original.
$product->get_id() es el método vigente desde WooCommerce 3.0. La antigua propiedad $product->id (acceso directo al campo) está obsoleta y genera avisos en los registros; no la use.
Puede ampliar el array $target_ids según necesite. Encuentre el ID del producto en el panel de administración: pase el cursor sobre el nombre del producto en la lista y el ID aparecerá en la barra de estado del navegador (o abra el producto y mire el número en la URL: post=22).
6. Reemplazar el botón con texto personalizado
A veces no necesita eliminar el botón; necesita reemplazarlo. Por ejemplo, para productos por encargo podría mostrar «Solicitar presupuesto» con un enlace a un formulario de contacto.
1 function ts_replace_cart_button_single( $html, $product ) { 2 $target_ids = array( 22 ); 3 if ( in_array( $product->get_id(), $target_ids ) ) { 4 return '<a href="/contact" class="button alt">Request a quote</a>'; 5 } 6 return $html; 7 } 8 add_filter( 'woocommerce_loop_add_to_cart_link', 'ts_replace_cart_button_single', 10, 2 );
Este filtro intercepta el HTML del botón antes de la salida y lo reemplaza con un enlace personalizado usando la clase .button. Funciona tanto para la cuadrícula de productos como para la página de producto; WooCommerce usa el mismo filtro en ambos contextos.
Para una lógica más compleja (texto diferente para distintos productos, un botón personalizado con una ventana modal), investigue woocommerce_template_single_add_to_cart para una anulación completa de la plantilla del botón mediante un tema hijo.
⁉️🤔 Preguntas frecuentes
¿Es seguro editar functions.php directamente?
Sin experiencia, no. functions.php se ejecuta en cada solicitud, y un error de sintaxis en él derriba todo el sitio (pantalla en blanco). Use el plugin Code Snippets, que proporciona una interfaz para añadir fragmentos PHP con verificación de sintaxis y desactivación automática ante errores fatales. Alternativamente, edite vía FTP/SFTP tras guardar una copia funcional del archivo localmente.
¿Cómo oculto el botón solo para usuarios no autenticados?
Añada una comprobación
is_user_logged_in()a cualquiera de las condiciones anteriores. Por ejemplo:if ( ! is_user_logged_in() && is_shop() ) { add_filter(...); }. Los invitados ven un escaparate sin botones; los usuarios registrados obtienen la funcionalidad completa. Este es un caso de uso común para tiendas mayoristas donde los precios y el carrito solo están disponibles tras iniciar sesión.
El botón desapareció pero el precio y las variaciones permanecieron; ¿es esto normal?
Sí. Los hooks
remove_actiony el filtrowoocommerce_is_purchasableeliminan solo el botón de añadir al carrito. El precio y los selectores de variación (color, talla) permanecen visualmente. Si necesita ocultarlos también, añada CSS:.single-product .variations_form, .single-product .price { display: none; }, o use una intervención más profunda mediantewoocommerce_get_price_html.
Tras una actualización del tema todos mis cambios se perdieron; ¿cómo me protejo contra esto?
Nunca haga cambios directamente en el
functions.phpdel tema padre. Cualquier actualización del tema sobrescribirá el archivo. Tres opciones fiables: un tema hijo (con su propiofunctions.php), el plugin Code Snippets (los fragmentos residen en la base de datos y sobreviven a las actualizaciones), o un MU-plugin simple (/wp-content/mu-plugins/disable-cart.php, que no se puede desactivar desde el panel de administración y no se ve afectado por las actualizaciones).
¿Puedo restaurar el botón para un producto específico tras una desactivación global?
Sí. Después de que el filtro
woocommerce_is_purchasabledevuelva globalmente__return_false, añada un segundo filtro con una prioridad más alta que devuelvatruepara los IDs necesarios:add_filter( 'woocommerce_is_purchasable', 'ts_enable_for_specific', 20, 2 );. La prioridad 20 se ejecuta después de 10 y puede anular el valor de retorno.
Qué método elegir para su tarea
Si está construyendo un escaparate sin pagos en línea, use la desactivación global con dos llamadas a remove_action. ¿Necesita bloquear las compras en el catálogo pero mantenerlas en las fichas de producto? Use el filtro con is_shop(). ¿Una categoría problemática? Use is_product_category('slug'). ¿Un producto entre cientos? Use la configuración de existencias nativa o el filtro por ID.
Y lo más importante: antes de cambiar nada en functions.php, haga una copia de seguridad. No mediante un plugin que esté a punto de editar, sino una copia de seguridad completa a través de su alojamiento o UpdraftPlus. Cinco minutos dedicados a una copia de seguridad ahorran horas de recuperación.



