# Como corrigir a exibição de estoque do WooCommerce com o JetEngine

O estoque do WooCommerce aparecer errado no JetEngine significa que o Listing Grid mostra quantidade diferente da real: número desatualizado, zero em produto disponível, ou estoque que não baixa após a venda. Quase sempre vem do Dynamic Field lendo a meta _stock crua em vez do estoque oficial, ou de cache servindo valor antigo.

## O que é o estoque do WooCommerce errado no JetEngine?

O JetEngine exibe dados de produto do WooCommerce através de um Dynamic Field, que lê um valor do banco e mostra no Listing Grid ou no template do produto. Quando esse campo aponta para a meta _stock crua, ele mostra o número guardado no banco sem passar pela camada de estoque do WooCommerce, que considera o status _stock_status, backorders e o formato de exibição configurado em WooCommerce -> Configurações -> Produtos -> Inventário. O resultado é um estoque que diverge do real: o cliente vê uma quantidade que não bate com a página nativa do produto, vê zero num item disponível, ou continua vendo o mesmo número depois de uma venda. Como o estoque é a base da decisão de compra, o erro causa venda de item esgotado e perda de pedido por produto marcado como indisponível sem motivo.

## Como identificar

- O Listing Grid montado no JetEngine mostra uma quantidade de estoque diferente da exibida na página nativa do produto WooCommerce.
- O produto continua aparecendo como 'Em estoque' com número antigo no JetEngine mesmo depois de uma venda já ter baixado o estoque real.
- O Dynamic Field mostra 0 ou vazio num produto que está disponível, porque a opção 'Gerenciar estoque?' está desligada e a meta _stock não existe.
- Produtos com 'Encomendas permitidas' (backorder) aparecem como esgotados no JetEngine, pois o campo só leu o número e ignorou o _stock_status.
- Ao limpar o cache do site, o estoque no JetEngine corrige por alguns minutos e depois volta a divergir.

## Como prevenir

- Sempre exiba estoque no JetEngine via o estoque oficial do WooCommerce, nunca lendo a meta _stock crua, para que status, backorder e formato de exibição sejam respeitados
- Mantenha o cache de query do JetEngine desligado nos listings que mostram estoque, ou invalide-o a cada pedido pago
- Padronize a opção 'Gerenciar estoque?' em todos os produtos que precisam exibir quantidade, para evitar campos vazios
- Após atualizar o WooCommerce ou o JetEngine, teste um Listing Grid de estoque comprando um item e conferindo se a baixa aparece na hora

Erros relacionados

- [Como corrigir estoque do WooCommerce mostrando errado](https://full.services/wp-fixer/corrigir-estoque-errado-woocommerce/)
- [Como corrigir o filtro de produtos do WooCommerce no JetSmartFilters](https://full.services/wp-fixer/corrigir-product-filter-woocommerce-jetsmartfilters/)
- [Como corrigir o Listing Grid vazio no JetEngine](https://full.services/wp-fixer/corrigir-listing-grid-vazio-jetengine/)

## Causa

- O Dynamic Field do JetEngine está com a fonte em 'Post Meta' apontando para a chave _stock, que guarda só o número cru e ignora o _stock_status, as backorders e o formato de exibição de inventário do WooCommerce.
- O produto está com a opção 'Gerenciar estoque?' desligada no editor, então a meta _stock não existe e o campo lê vazio, enquanto o _stock_status segue como instock.
- O Listing Grid está sob cache (cache de página do WP Rocket, object cache Redis, ou o próprio cache de query do JetEngine) servindo o valor de estoque capturado antes da última venda.
- A opção 'Formato de exibição de estoque' em WooCommerce -> Configurações -> Produtos -> Inventário está como 'Nunca mostrar quantidade', mas o Dynamic Field força a meta _stock e exibe um número que a loja deveria esconder.
- Há HPOS (armazenamento de pedidos em tabelas próprias) ativo e um plugin de terceiros sincroniza estoque por outra rota, deixando a meta _stock do produto dessincronizada do estoque calculado por wc_get_product.

## Como resolver

1. Confirme qual valor está certo: abra a página nativa do produto no admin e compare a quantidade real com a exibida no Listing Grid do JetEngine. Anote se o produto gerencia estoque, qual o status e se permite encomendas, para saber se o erro é de leitura ou de cache.
2. Troque a fonte do Dynamic Field: no Dynamic Field do JetEngine, deixe de ler a meta crua e passe a usar o estoque oficial do WooCommerce. Na configuração do campo, ajuste a fonte de Post Meta para o callback de estoque do WooCommerce, ou troque a meta key conforme o que você precisa exibir.

```
Fonte: WooCommerce / Object Field (em vez de Post Meta cru)
_stock_status
_manage_stock
```

3. Garanta que o produto gerencia estoque: no editor do produto, na aba Inventário, marque a opção de gerenciar estoque e defina a quantidade. Sem isso a meta _stock não é gravada e qualquer campo que a leia fica vazio.
4. Produto -> Dados do produto -> Inventário -> Gerenciar estoque?
5. Alinhe o formato de exibição de estoque: verifique a configuração global de inventário do WooCommerce e decida se a quantidade deve aparecer. Se a loja esconde quantidade, o Dynamic Field deve mostrar status, não o número cru.

```
WooCommerce -> Configurações -> Produtos -> Inventário -> Formato de exibição de estoque
```

6. Limpe o cache do listing após uma venda: force a limpeza do cache de página e do object cache, e desligue o cache de query do JetEngine para esse Listing Grid de estoque. Teste fazendo uma compra e confirmando que o número baixa na hora.

```
wp cache flush
JetEngine -> Listing -> Meta Query -> Cache: Off
```


## Código

```php
// functions.php do tema filho — callback de exibição de estoque p/ Dynamic Field do JetEngine.
// Lê o estoque OFICIAL via wc_get_product (respeita status, backorder e gerenciamento),
// em vez da meta _stock crua. Registre o callback no campo do JetEngine.
add_filter( 'jet-engine/listings/dynamic-field/custom-callback', function ( $callbacks ) {
    $callbacks['full_wc_stock_label'] = 'FULL: estoque WooCommerce (oficial)';
    return $callbacks;
} );

function full_wc_stock_label( $product_id ) {
    $product = wc_get_product( $product_id );
    if ( ! $product ) {
        return '';
    }
    if ( ! $product->managing_stock() ) {
        return $product->is_in_stock() ? 'Em estoque' : 'Esgotado';
    }
    $qty = (int) $product->get_stock_quantity();
    if ( $qty > 0 ) {
        return sprintf( '%d em estoque', $qty );
    }
    return $product->backorders_allowed() ? 'Disponível por encomenda' : 'Esgotado';
}
```

## Perguntas frequentes

### Por que o JetEngine mostra um estoque diferente da página do produto?

Porque o Dynamic Field provavelmente lê a meta _stock crua, que é só o número guardado no banco. A página nativa do WooCommerce passa esse número pela camada de estoque, que considera o status do produto, as encomendas permitidas e o formato de exibição. Aponte o campo para o estoque oficial do WooCommerce para os dois baterem.

### O estoque no Listing Grid não muda depois de uma venda. O que fazer?

Isso é cache. O Listing Grid pode estar sob cache de página, object cache ou cache de query do próprio JetEngine, servindo o valor capturado antes da compra. Desligue o cache de query desse listing e invalide o cache de página a cada pedido pago para o número baixar na hora.

### O Dynamic Field mostra zero num produto que está disponível. Por quê?

Quando a opção de gerenciar estoque está desligada no produto, a meta _stock não existe e o campo lê vazio ou zero, mesmo com o status como Em estoque. Marque a opção de gerenciar estoque na aba Inventário e defina a quantidade, ou exiba o status em vez do número.

### Como exibir só o status em vez da quantidade no JetEngine?

Use a meta _stock_status como fonte do Dynamic Field. Ela retorna instock, outofstock ou onbackorder, que você pode mapear para texto amigável. Isso respeita a escolha de esconder quantidade feita em Configurações de Inventário do WooCommerce.

### Produtos com encomenda permitida aparecem esgotados no JetEngine. Como resolver?

O campo está lendo só o número e o estoque chegou a zero, mas o produto permite backorder. Em vez da quantidade crua, leia o estoque oficial do WooCommerce, que considera o status onbackorder, ou exiba o _stock_status para que o item continue como disponível por encomenda.

### Mudar para o estoque oficial do WooCommerce quebra o filtro de estoque do JetSmartFilters?

Não precisa quebrar. O filtro continua operando sobre a meta de estoque do produto. Se você exibe via callback oficial mas filtra por meta, padronize a chave usada nos dois lugares, normalmente _stock_status para disponibilidade, para que exibição e filtro fiquem consistentes.

### Essa correção exige editar código do tema?

Na maioria dos casos não. A troca da fonte do Dynamic Field, o ajuste de gerenciar estoque e a limpeza de cache são feitos pelo painel. Só é preciso código se você quiser formatar a saída do estoque com um callback próprio, como mostrar Em estoque acima de um limite.

**Fonte:** [WooCommerce — Products Settings (Inventory)](https://woocommerce.com/document/configuring-woocommerce-settings/products/)
