Skip to content

Tudo para WordPress, desenvolvimento web — e não só

Como remover o botão Adicionar ao carrinho no WooCommerce

Como remover o botão Adicionar ao carrinho no WooCommerce

O botão «Adicionar ao carrinho» é o mecanismo fundamental no WooCommerce que mantém a sua loja a funcionar. Mas fundamental não significa sempre adequado. Um site de mostra sem capacidade de encomenda, um produto por encomenda que exige preço individual, um artigo esgotado que ainda não deve ser desp publicitado: em todos estes casos, o botão Adicionar ao Carrinho padrão só atrapalha.

Poderia adotar a abordagem direta e definir o estado do produto como «oculto», mas assim ele desaparece do catálogo e deixa de ser indexado. Uma solução muito mais limpa é manter a ficha do produto visível, removendo ou substituindo o botão de compra. O WooCommerce disponibiliza vários hooks e filtros para isso, desde a desativação global até à ocultação precisa num único produto.

Abaixo estão todos os métodos funcionais, do simples ao avançado. Cada um foi testado na versão atual do WooCommerce.

💡 Resumo rápido:

  • Site inteiro de uma vez: duas chamadas remove_action no functions.php, uma para a grelha de produtos e outra para a página de produto
  • Página inicial e arquivos: filtro condicional woocommerce_is_purchasable usando is_shop()
  • Todas as categorias ou uma categoria específica: mesmo filtro com is_product_category() ou is_product_category('slug')
  • Produto único: três métodos, opção de administração integrada, zerar o stock, filtro por product_id
  • Para quem precisa de um botão: substitua-o por texto personalizado ou um botão «Solicitar orçamento»

1. Remover o botão de todo o site

Se a sua loja funciona apenas como montra, sem intenção de compra, a abordagem mais simples é remover o botão globalmente usando dois hooks no functions.php do seu tema ativo.

O primeiro hook trata dos cartões de produto na grelha (o shortcode [products], página de loja, categorias), enquanto o segundo trata das páginas de produto individuais:

1// Remove button from card grid
2remove_action(
3 'woocommerce_after_shop_loop_item',
4 'woocommerce_template_loop_add_to_cart'
5);
6
7// Remove button from product page
8remove_action(
9 'woocommerce_single_product_summary',
10 'woocommerce_template_single_add_to_cart',
11 30
12);

É melhor colocar este código não diretamente no functions.php do seu tema (o que arrisca perder alterações nas atualizações), mas através do plugin Code Snippets ou de um tema filho. Antes de fazer qualquer edição, crie uma cópia de segurança; sem ela, não terá para onde recuar.

2. Ocultar o botão na página inicial e nas páginas de arquivo

A desativação global não funciona para todos. Um cenário comum: o botão deve permanecer na página de produto, mas desaparecer do catálogo e da página inicial (onde os produtos são exibidos em lista).

Aqui, em vez de remove_action, é melhor usar o filtro woocommerce_is_purchasable com uma verificação condicional is_shop():

1function ts_hide_cart_on_shop() {
2 if ( is_shop() || is_front_page() ) {
3 add_filter( 'woocommerce_is_purchasable', '__return_false' );
4 }
5}
6add_action( 'wp', 'ts_hide_cart_on_shop' );

O hook wp é executado cedo, antes da renderização, e evita verificações repetidas que tornariam a página mais lenta. is_shop() abrange a página principal da loja, e is_front_page() abrange uma página inicial estática se esta exibir um shortcode do WooCommerce. O filtro não se aplica às páginas de produto, por isso a compra funciona normalmente nelas.

3. Remover o botão de todas as páginas de categoria

Mesmo princípio, mas substitua is_shop() por is_product_category() sem parâmetro. O filtro irá abranger qualquer categoria de produto:

1function ts_hide_cart_in_categories() {
2 if ( is_product_category() ) {
3 add_filter( 'woocommerce_is_purchasable', '__return_false' );
4 }
5}
6add_action( 'wp', 'ts_hide_cart_in_categories' );

O botão permanece nas páginas de produto individuais. Isto é útil quando o catálogo serve de montra e a compra só está disponível após navegar para a ficha do produto, por exemplo, para que os utilizadores leiam primeiro a descrição e as especificações.

4. Desativar o botão para uma única categoria

Por vezes, uma categoria na sua loja é por encomenda, enquanto as restantes são padrão. Nesse caso, precisa de um bloqueio direcionado pelo slug da categoria:

1function ts_hide_cart_for_category() {
2 if ( is_product_category( 'pod-zakaz' ) ) {
3 add_filter( 'woocommerce_is_purchasable', '__return_false' );
4 }
5}
6add_action( 'wp', 'ts_hide_cart_for_category' );

Substitua 'pod-zakaz' pelo slug real da sua categoria alvo. Pode encontrar o slug no painel de administração em «Produtos → Categorias», na coluna «Slug». O filtro desativa silenciosamente a compra para todos os produtos na categoria; o botão também desaparecerá na página de produto porque o WooCommerce também verifica is_purchasable() aí.

5. Ocultar o botão para um produto específico

O cenário mais comum: um produto entre centenas precisa de ser exibido temporariamente sem a possibilidade de encomenda. O WooCommerce oferece três formas de o fazer.

Método 1: opção de administração integrada

Vá editar o produto, abra o separador «Inventário» e mude «Estado do stock» para «Esgotado». Defina a caixa de verificação «Permitir reservas» para «Não permitir». Guarde o produto e o botão Adicionar ao Carrinho desaparecerá automaticamente.

Configurar estado de stock de produtos no WooCommerce

Esta abordagem não requer código e funciona de origem. A desvantagem é que o produto fica marcado como «Esgotado», o que nem sempre é desejável (por exemplo, para produtos digitais ou serviços onde «stock» não faz sentido).

Método 2: zerar a quantidade de stock

No mesmo separador «Inventário», desmarque «Gerir stock» ou defina a quantidade como 0. O botão desaparecerá quando o stock restante atingir zero.

Zerar quantidade do produto para ocultar o botão de compra

Este método funciona bem para produtos físicos: assim que a última unidade for vendida, o botão desaparece por si. No entanto, tal como no primeiro método, o produto recebe o estado de esgotado.

Método 3: filtro por ID do produto

Se precisar de remover o botão sem alterar o estado «Em stock», use um filtro que verifique o ID:

1function 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}
8add_filter( 'woocommerce_is_purchasable', 'ts_disable_cart_for_product', 10, 2 );

Eis o que acontece: o filtro woocommerce_is_purchasable recebe o estado atual $purchasable e o objeto $product. Se $product->get_id() corresponder a um dos IDs no array $target_ids, devolve false e o botão é suprimido. Para todos os outros produtos, o estado original é devolvido.

$product->get_id() é o método atual desde o WooCommerce 3.0. A antiga propriedade $product->id (acesso direto ao campo) está obsoleta e gera avisos nos registos; não a utilize.

Pode expandir o array $target_ids conforme necessário. Encontre o ID do produto no painel de administração: passe o cursor sobre o nome do produto na lista e o ID aparecerá na barra de estado do navegador (ou abra o produto e veja o número no URL: post=22).

6. Substituir o botão por texto personalizado

Por vezes, não precisa de remover o botão; precisa de o substituir. Por exemplo, para produtos por encomenda, pode exibir «Solicitar orçamento» com um link para um formulário de contacto.

1function 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}
8add_filter( 'woocommerce_loop_add_to_cart_link', 'ts_replace_cart_button_single', 10, 2 );

Este filtro interceta o HTML do botão antes da saída e substitui-o por um link personalizado usando a classe .button. Funciona tanto para a grelha de produtos como para a página de produto; o WooCommerce usa o mesmo filtro em ambos os contextos.

Para lógica mais complexa (texto diferente para produtos diferentes, um botão personalizado com uma janela modal), explore woocommerce_template_single_add_to_cart para uma substituição completa do modelo do botão através de um tema filho.

⁉️🤔 Perguntas frequentes

É seguro editar o functions.php diretamente?

Sem experiência, não. O functions.php é executado em cada pedido e um erro de sintaxe nele derruba o site inteiro (ecrã branco). Use o plugin Code Snippets, que fornece uma interface para adicionar fragmentos PHP com verificação de sintaxe e desativação automática em erros fatais. Em alternativa, edite via FTP/SFTP depois de guardar uma cópia funcional do ficheiro localmente.

Como oculto o botão apenas para utilizadores não autenticados?

Adicione uma verificação is_user_logged_in() a qualquer uma das condições acima. Por exemplo: if ( ! is_user_logged_in() && is_shop() ) { add_filter(...); }. Os visitantes veem uma montra sem botões; os utilizadores registados obtêm a funcionalidade completa. Este é um caso de uso comum para lojas de grossistas, onde os preços e o carrinho só ficam disponíveis após o início de sessão.

O botão desapareceu, mas o preço e as variações permaneceram; isto é normal?

Sim. Os hooks remove_action e o filtro woocommerce_is_purchasable removem apenas o botão de adicionar ao carrinho. O preço e os seletores de variação (cor, tamanho) permanecem visualmente. Se precisar de ocultar também esses, adicione CSS: .single-product .variations_form, .single-product .price { display: none; }, ou use uma intervenção mais profunda via woocommerce_get_price_html.

Após uma atualização do tema, todas as minhas alterações foram perdidas; como me protejo contra isto?

Nunca faça alterações diretamente no functions.php do tema principal. Qualquer atualização do tema substituirá o ficheiro. Três opções fiáveis: um tema filho (com o seu próprio functions.php), o plugin Code Snippets (os snippets residem na base de dados e sobrevivem a atualizações) ou um MU-plugin simples (/wp-content/mu-plugins/disable-cart.php, que não pode ser desativado do painel de administração e não é afetado por atualizações).

Posso restaurar o botão para um produto específico após uma desativação global?

Sim. Depois de o filtro woocommerce_is_purchasable devolver globalmente __return_false, adicione um segundo filtro com uma prioridade mais alta que devolva true para os IDs necessários: add_filter( 'woocommerce_is_purchasable', 'ts_enable_for_specific', 20, 2 );. A prioridade 20 é executada depois da 10 e pode substituir o valor de retorno.

Qual o método a escolher para a sua tarefa

Se está a construir uma montra sem pagamentos online, use a desativação global com duas chamadas remove_action. Precisa de bloquear compras no catálogo, mas mantê-las nas fichas de produto? Use o filtro com is_shop(). Uma categoria problemática? Use is_product_category('slug'). Um produto entre centenas? Use as definições de stock integradas ou o filtro por ID.

E, acima de tudo: antes de alterar o que quer que seja no functions.php, faça uma cópia de segurança. Não através de um plugin que está prestes a editar, mas uma cópia de segurança completa via o seu alojamento ou UpdraftPlus. Cinco minutos gastos numa cópia de segurança poupam horas de recuperação.