Reduzir estoque automaticamente ao criar pedido no WooCommerce

Por padrão, o WooCommerce apenas irá reduzir o estoque dos produtos de um pedido após ter o pagamento confirmado. Se você trabalha com pouco estoque, isto pode ser um problema, caso um cliente compre uma peça e esta já tenha sido vendida.

No entanto, mudar esse comportamento para que o estoque seja reduzido ao gerar o pedido – e não ao confirmar o pagamento -, pode gerar outro problema: perder uma venda porque alguém iniciou uma compra e não pagou. Paciência.

Como cada caso é um caso, você pode decidir qual é o melhor para o seu negócio. Se você prefere reduzir o estoque apenas após a confirmação do pagamento, não precisa fazer nada, já que o WooCommerce é assim por padrão. Agora, se você quer reduzir o estoque logo que o pedido é criado, basta copiar e colar este snippet para o functions.php do seu tema.


Para quem ainda não conhece, WooCommerce é atualmente a plataforma de e-commerce mais utilizada no mundo, representando mais de 30% do mercado. Sim, isso é verdade. Se alguém ainda insiste que é o Magento, saiba que ele está pensando com alguns anos de atraso. Mesmo assim, sei que é possível um produto ser o mais vendido e não ser o melhor. Muita gente ainda acredita que por “ser apenas um plugin para WordPress”, WooCommerce não é uma boa saída. No entanto, qualquer coisa que você pensar “ah, preciso do Magento para isso” pode ser feita facilmente com WooCommerce e, muito provavelmente, com um custo mais baixo.

WooCommerce é completamente flexível e permite construir projetos incríveis e complexos, tanto quanto – ou melhor que – as plataformas de e-commerce mais antigas.

18 comentários em “Reduzir estoque automaticamente ao criar pedido no WooCommerce”

  1. Ótimo Fernando, só estou com problemas na utilização do código junto ao método de pagamento “pagseguro”. O código acaba baixando o estoque apenas para pedidos em “aguardando” não baixando para “aguardando pagamento” gerado pelo pagseguro. Teria alguma alteração para que consiga baixar o estoque no status “aguardando pagamento” ?

    Ótimo seu blog,
    Parabéns !

    1. Fernando Fresinghelli

      Olá, Rodolfo! Obrigado pelo seu comentário.

      Provavelmente irá funcionar se você substituir a linha 10 pelo seguinte:

      add_action( ‘woocommerce_order_status_pending’, ‘facosta_auto_stock_reduce’ );

      Se funcionar, me avise!

      Abraço!

  2. Oi Fernando, boa noite,

    Eu testei o seu código e funcionou perfeitamente.
    O site que eu tenho já baixa o estoque automaticamente quando uma operação é aprovada (que é o tradicional do woocommerce), e eu gostei do seu código principalmente para baixar manualmente quando é gerado um pedido na situação do boleto, que o status vai para “Aguardando”.

    O que ocorre é que agora, por exemplo, quando um cliente compra com cartão, o site baixa o produto 2 vezes, uma quando gerou o pedido e outra quando recebe a baixa de pagamento de cartão.

    Para resolver isso, você sabe se existe alguma forma de:

    Baixar do estoque manualmente do jeito que você montou, apenas quando for boleto, ou seja, apenas quando o status do pedido for de “Gerado/Pendente” para “Aguardando”.

    E fazer de forma que, ao receber a baixa de pagamento (via pagseguro), a loja ignore baixar o estoque quando for boleto, já que já houve a baixa manual dele quando gerou-se o pedido.

    Dessa forma ficaria perfeito, mas não estou conseguindo fazer, você poderia me ajudar?

    Obrigado!

    Paulo

  3. Ótimo Fernando!

    Existe um lugar específico no functions.php para colar este snippet? Colei no final e meu woocommerce fica todo branco.

    abs,

  4. Olá Fernando, como vai? Em quanto tempo o produto volta ao estoque, caso o cliente não efetue o pagamento?

    Pergunto, pois os clientes demoram pra pagar/dar baixa em casos de boleto.

  5. Oi.
    Eu estou com um problema. Esse plugin às vezes reduz o estoque do mesmo pedido 2 ou 3 vezes. Acho que é algum bug, ou conflito com algum outrodos meus plugins. Teria como bloquear para esse plugin para não executar mais de 1 vez no mesmo pedido?

  6. Fernando,

    Testei a solução que propôs com o objetivo de reduzir o estoque assim que o pedido é feito, ou seja, quando o status do pagamento é “Aguardando Pagamento”.

    Não funcionou :(

    Ele não reduziu o estoque mesmo depois do boleto ser gerado, enquanto o pedido se manteve com o status “Aguardando Pagamento”.

    O que pode ser?

  7. Aee gurizada.
    Catei um pouco na net e, graças ao Claudio Sanches (Que todos vocês devem conhecer), encontrei isso: https://github.com/claudiosmweb/reduce-stock-of-manual-orders-for-woocommerce/blob/master/reduce-stock-of-manual-orders-for-woocommerce.php
    Funcionou perfeitamente pra mim, mas precisa esse código/ plugin para recadastrar o produtos no estoque, quando o pedido for cancelado:
    /**
    * Plugin Name: WooCommerce Auto Restore Stock
    * Plugin URI: http://gerhardpotgieter.com/tag/woocommerce-auto-restore-stock
    * Description: Auto restore stock when orders are cancelled
    * Version: 1.0.1
    * Author: Gerhard Potgieter
    * Author URI: http://gerhardpotgieter.cim
    * License: GPL2
    */

    /* Copyright 2013 Gerhard Potgieter (email : potgieterg@gmail.com)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as
    published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
    */

    if ( ! defined( ‘ABSPATH’ ) ) exit; // Exit if accessed directly

    if ( ! class_exists( ‘WC_Auto_Stock_Restore’ ) ) {

    class WC_Auto_Stock_Restore {

    public function __construct() {
    add_action( ‘woocommerce_order_status_processing_to_cancelled’, array( $this, ‘restore_order_stock’ ), 10, 1 );
    add_action( ‘woocommerce_order_status_completed_to_cancelled’, array( $this, ‘restore_order_stock’ ), 10, 1 );
    add_action( ‘woocommerce_order_status_on-hold_to_cancelled’, array( $this, ‘restore_order_stock’ ), 10, 1 );
    add_action( ‘woocommerce_order_status_processing_to_refunded’, array( $this, ‘restore_order_stock’ ), 10, 1 );
    add_action( ‘woocommerce_order_status_completed_to_refunded’, array( $this, ‘restore_order_stock’ ), 10, 1 );
    add_action( ‘woocommerce_order_status_on-hold_to_refunded’, array( $this, ‘restore_order_stock’ ), 10, 1 );
    } // End __construct()

    public function restore_order_stock( $order_id ) {
    $order = new WC_Order( $order_id );

    if ( ! get_option(‘woocommerce_manage_stock’) == ‘yes’ && ! sizeof( $order->get_items() ) > 0 ) {
    return;
    }

    foreach ( $order->get_items() as $item ) {

    if ( $item[‘product_id’] > 0 ) {
    $_product = $order->get_product_from_item( $item );

    if ( $_product && $_product->exists() && $_product->managing_stock() ) {

    $old_stock = $_product->stock;

    $qty = apply_filters( ‘woocommerce_order_item_quantity’, $item[‘qty’], $this, $item );

    $new_quantity = $_product->increase_stock( $qty );

    do_action( ‘woocommerce_auto_stock_restored’, $_product, $item );

    $order->add_order_note( sprintf( __( ‘Item #%s stock incremented from %s to %s.’, ‘woocommerce’ ), $item[‘product_id’], $old_stock, $new_quantity) );

    $order->send_stock_notifications( $_product, $new_quantity, $item[‘qty’] );
    }
    }
    }
    } // End restore_order_stock()
    }
    $GLOBALS[‘wc_auto_stock_restore’] = new WC_Auto_Stock_Restore();
    }

  8. Gostei do artigo! estava precisando dessa ajuda.

    Porém, há uma dúvida. O WooCommerce em minha loja virtual
    não está gerenciando o estoque nem depois do pedido concluído.
    o que pode ser?

  9. ESTAVA COM PROBLEMA NO ESTOQUE, QUANDO REALIZAVA O PEDIDO O ESTOQUE NAO DESCIA.
    CONSEGUI RESOLVER ATE O MOMENTO USANDO A SEGUINTE FUNÇÃO

    /**
    * REDUZIR ESTOQUE AO CRIAR PEDIDO
    */

    add_action( ‘woocommerce_thankyou’, ‘woocommerce_reduce_order_stock’ );
    function woocommerce_reduce_order_stock( $order_id ) {
    global $woocommerce;

    if ( !$order_id )
    return;
    $order = new WC_Order( $order_id );
    $order->reduce_order_stock();
    }

    add_filter( ‘woocommerce_payment_complete_reduce_order_stock’, ‘__return_false’ );

    E ADICIONEI UM PLUGIN, PARA SE CANCELAR O PEDIDO O ITEM VOLTA AO ESTOQUE
    – WooCommerce Auto Restore Stock

    AINDA ESTOU TESTANDO, APARENTEMENTE ESTA FUNCIONANDO, TESTE COM METODO DE PAGAMENTO NA ENTREGA E COM PAGSEGUNDO MODO BOLETO E REDUZIU O ESTOQUE COMO ESPERADO. QUEM FIZER MAIS TESTES AVISE

    1. Daniel, beleza?

      Estou com o mesmo problema, com esse código em que momento baixa o estoque? Quando o cliente finaliza de fato o pedido?

      É que estava usando um código um pouco diferente, aí acontece as vezes do pedido dar algum erro por algum dado não preenchido, aí quando o cliente corrigi e de fato finaliza o pedido, o estoque é baixado 2 vezes.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *