fix: respect manage_stock on stock check and harden only_in_stock filter - #21
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Complementa #20, que trouxe o
only_in_stock. O filtro está no ar e funcionando, mas herdou a regra de estoque existente, que ignoramanage_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: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 comoout 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 stock→in stock, nunca o contrário. Comparando a regra antiga com a nova, a única diferença de comportamento é o curto-circuito domanage_stock:quantity && ...→quantity > 0emin_quantity→(int) min_quantitysão equivalentes para todo valor possível em PHP.Alcance medido em 3 lojas de produção, 568 entries no total: 2 entries mudam.
out of stockhojein stockDemais mudanças
Regra de estoque unificada. Estava duplicada em três pontos que divergiam entre si — filtro do produto (
xml()),availabilityda entry e filtro da variação. Virouis_in_stock(), maishas_any_stock()para o caso de produto com variações. Os-40do diff emlib/main.phpsão essas cópias saindo.Entry do produto-pai. Com
only_in_stockativo, se qualquer variação tinha saldo o produto passava no filtro e a entry do pai era emitida mesmo comavailability: out of stock— um feed "apenas em estoque" contendo item sem estoque. Agora nenhuma entryout 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_stockeall.xmlsem 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 paraskip_variationsediscount. 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 -llimpo nos arquivos alterados.FO573868deout of stockparain stock, exatamente a prevista. XML validado por parser.&only_in_stock: 86 entries, todasin stock, deixando de fora exatamenteFO963604,CNC2450,CNC2450-114-1,CNC2450-509-2eCNC0028-512-2. XML validado.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
Deprecatedpré-existentes (assinatura doxml()estrtolower(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:
Hoje devolve
85. Depois do deploy tem que devolver86.Painel
O
only_in_stockestá 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