Skip to content

fix: respect manage_stock on stock check and harden only_in_stock filter - #21

Merged
vitorrgg merged 4 commits into
masterfrom
only-in-stock
Aug 6, 2026
Merged

fix: respect manage_stock on stock check and harden only_in_stock filter#21
vitorrgg merged 4 commits into
masterfrom
only-in-stock

Conversation

@vitorrgg

@vitorrgg vitorrgg commented Aug 4, 2026

Copy link
Copy Markdown
Member

Complementa #20, que trouxe o only_in_stock. O filtro está no ar e funcionando, mas herdou a regra de estoque existente, que ignora manage_stock — e no contexto de um filtro isso deixou de ser cosmético: produto vendável passou a ser removido do feed.

O bug

Produto com manage_stock: false é comprável independente da quantidade armazenada, mas a regra de estoque lê só a quantidade. Efeito medido agora, em produção, na loja 51493:

...&only_in_stock=true   →  85 entries

Falta o FO573868 (manage_stock: false, quantidade 0), que a loja vende normalmente. Com esta PR são 86. Antes da #20 o mesmo produto já era enviado como out of stock, o que derrubava o anúncio; agora ele desaparece do feed.

Não é um caso isolado: 46 dos 85 produtos dessa loja (54%) estão com manage_stock: false. Qualquer um deles que zere o estoque some do feed hoje.

A correção só consegue mudar out of stockin stock, nunca o contrário. Comparando a regra antiga com a nova, a única diferença de comportamento é o curto-circuito do manage_stock: quantity && ...quantity > 0 e min_quantity(int) min_quantity são equivalentes para todo valor possível em PHP.

Alcance medido em 3 lojas de produção, 568 entries no total: 2 entries mudam.

Loja Entries out of stock hoje Viram in stock
51493 91 6 1
1024 135 10 0
3967 342 89 1

Demais mudanças

Regra de estoque unificada. Estava duplicada em três pontos que divergiam entre si — filtro do produto (xml()), availability da entry e filtro da variação. Virou is_in_stock(), mais has_any_stock() para o caso de produto com variações. Os -40 do diff em lib/main.php são essas cópias saindo.

Entry do produto-pai. Com only_in_stock ativo, se qualquer variação tinha saldo o produto passava no filtro e a entry do pai era emitida mesmo com availability: out of stock — um feed "apenas em estoque" contendo item sem estoque. Agora nenhuma entry out of stock é emitida quando o parâmetro está presente.

Colisão de cache no all.xml. O arquivo era /tmp/products-feed-$store_id.xml, sem os parâmetros na chave. all.xml?only_in_stock e all.xml sem o parâmetro gravavam e liam o mesmo arquivo — quem gerasse primeiro definia o conteúdo de ambos por até 10 minutos. Vale também para skip_variations e discount. O nome agora inclui um hash das opções que alteram a saída; requisições sem opção mantêm o nome original, então os caches atuais de todas as lojas continuam válidos.

Testes

Executado localmente em PHP 8.3 contra a API real da loja 51493.

  • php -l limpo nos arquivos alterados.
  • Feed completo × produção, entry a entry: 91 entries em ambos, uma única diferençaFO573868 de out of stock para in stock, exatamente a prevista. XML validado por parser.
  • &only_in_stock: 86 entries, todas in stock, deixando de fora exatamente FO963604, CNC2450, CNC2450-114-1, CNC2450-509-2 e CNC0028-512-2. XML validado.
  • Cache do all.xml: dois arquivos distintos gerados, o padrão mantendo o nome original, cada variante servindo o próprio conteúdo com os links resolvidos corretamente.

Os únicos avisos em runtime são dois Deprecated pré-existentes (assinatura do xml() e strtolower(null) na linha 424), silenciosos em produção.

Como validar depois do deploy

O repositório não tem CI, então o deploy é externo. Para confirmar que chegou em produção:

curl -s "https://storefront.e-com.plus/products-feed.xml?store_id=51493&domain=loja.foison.com.br&only_in_stock=true" | grep -c "<entry>"

Hoje devolve 85. Depois do deploy tem que devolver 86.

Painel

O only_in_stock está no ar desde a #20 sem lugar na interface — o lojista só consegue usar colando o parâmetro na URL na mão. O checkbox correspondente está em ecomplus/admin#934.

🤖 Generated with Claude Code

vitorrgg and others added 4 commits March 13, 2026 16:50
Products with  are purchasable whatever the stored
quantity is, but the feed was reading the quantity alone and sending them
to Google as , suppressing ads for products actually on sale.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
New  URL param leaves out of the feed every product and
variation with no available stock, so out of stock items stop reaching
Google Merchant Center.

The all.xml cache filename now includes the options changing the output
(skip_variations, only_in_stock and discount), which shared a single file
per store and served one variant content to another. Requests with no
option keep the original filename, so current caches stay valid.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vitorrgg vitorrgg changed the title feat: add only_in_stock option and fix stock check ignoring manage_stock fix: respect manage_stock on stock check and harden only_in_stock filter Aug 5, 2026
@vitorrgg
vitorrgg merged commit 7678ee1 into master Aug 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant