Magento 2

Cannot query field no GraphQL do Magento 2: o campo existe e some

A query volta com Cannot query field "meu_campo" on type "ProductInterface" e o campo está lá, escrito no schema.graphqls do seu módulo. Em nove de cada dez vezes o schema não tem culpa: é cache. O Magento costura os arquivos de todos os módulos uma vez, guarda o resultado, e enquanto a versão velha estiver de pé aquele campo simplesmente não existe para o servidor.

A limpeza que resolve

cd /var/www/loja
sudo -u www-data rm -rf generated/code generated/metadata
sudo -u www-data bin/magento setup:upgrade
sudo -u www-data bin/magento setup:di:compile
sudo -u www-data bin/magento cache:flush

Duas ressalvas antes de colar isso em produção. A loja fica fora do ar entre o rm -rf generated/ e o fim do setup:di:compile, então rode em janela de manutenção. E o cache:clean config sozinho não adianta: o schema costurado é gravado com o id Magento_Framework_GraphQlSchemaStitching_Config_Data e sem a tag CONFIG, e o cache:clean apaga por tag. Quem derruba é o cache:flush, que esvazia o storage inteiro. Apagar var/cache na unha também só resolve se o backend for arquivo; com Redis não tem nada ali.

Confirme o que o servidor carregou

Em vez de adivinhar, pergunte ao próprio endpoint quais campos o tipo tem hoje:

curl -s https://sualoja.com.br/graphql 
  -H 'Content-Type: application/json' 
  -d '{"query":"{ __type(name: "ProductInterface") { fields { name } } }"}'

Se a resposta for GraphQL introspection is not allowed, o bloqueio é o graphql/disable_introspection do app/etc/env.php; em produção ele fica ligado mesmo, faça o teste em homologação. Campo fora da lista é problema no servidor: o arquivo precisa estar em app/code/Vendor/Modulo/etc/schema.graphqls, e não em etc/frontend/, porque o leitor de schema roda no escopo global e não olha em subpasta de área. Depois disso, confira se o módulo está ligado com bin/magento module:status Vendor_Modulo.

Última pegadinha: consulta GraphQL por GET entra no full page cache. Depois de mexer no schema, teste com POST, senão você vai debugar meia hora uma resposta que ficou congelada.

Post Recentes

Block pattern não aparece no inseridor: registre pelo arquivo em /patterns

Padrão registrado no functions.php que não aparece na aba Padrões. O caminho curto do WordPress 6.9: um arquivo PHP na…

1 dia atrás

Tamanho das tabelas MySQL 8: a query que acha o vilão do disco

Disco lotando por causa do banco? Uma query no information_schema mostra qual tabela cresceu, quanto é dado, quanto é índice…

1 dia atrás

CodeIgniter 3 PHP 8.3: os erros fatais que aparecem logo no boot

Sistema em CodeIgniter 3.1.13 morre no primeiro request depois do upgrade. Os três pontos que quebram no PHP 8.3 e…

2 dias atrás

rsync do pub/media no Magento 2: copiar as imagens sem levar o cache

Metade do seu pub/media é miniatura descartável. Veja o rsync com os excludes certos e o comando que reconstrói o…

3 dias atrás

mu-plugins no WordPress: onde colocar snippets em vez do functions.php

Tire os snippets do functions.php e coloque num must-use plugin: carrega sempre, sobrevive à atualização do tema e ninguém desativa…

3 dias atrás

preg_replace_callback no PHP: substituir cada match com uma função

Quando o valor novo depende do que a regex achou, preg_replace não resolve. Exemplo real aplicando 10% de desconto em…

4 dias atrás