Cliente manda print do Search Console reclamando que o sitemap tem URL de produto que saiu do ar e não tem os produtos novos. Abrimos o arquivo e a última linha de data é de fevereiro. Ninguém mexeu em nada — e é exatamente esse o problema.
São três pontos de falha, e dá para checar os três em cinco minutos.
1. Existe sitemap cadastrado?
No Magento, sitemap não é uma configuração: é um registro que você cria em Marketing > SEO & Search > Site Map, com nome do arquivo e caminho, um por store view. Sem esse registro, não existe nada para o cron gerar.
A tabela é literalmente sitemap:
SELECT sitemap_id, sitemap_filename, sitemap_path, store_id, sitemap_time
FROM sitemap;Zero linhas? Achou o problema: ninguém nunca criou o sitemap. Crie um registro por store view, com sitemap.xml no caminho /.
Voltou linha? Olhe o sitemap_time. É a data da última geração. Se for antiga, o registro existe mas nada está rodando — segue para o próximo passo.
2. A geração automática vem desligada
No etc/config.xml do Magento_Sitemap, o padrão é <enabled>0</enabled>. E o observer que o cron chama começa checando isso: se a flag não está ligada, ele dá return na hora, sem tocar em nenhum registro.
php bin/magento config:show sitemap/generate/enabledSe voltar 0, ligue:
php bin/magento config:set sitemap/generate/enabled 1
php bin/magento cache:clean configUm detalhe: ligando pela CLI, o horário fica no padrão do core, que é 0 0 * * * — meia-noite todo dia. O campo Frequency do admin tem um backend model que reescreve o crontab/default/jobs/sitemap_generate/schedule/cron_expr quando você salva a seção. Então, se quiser outro horário, ajuste Frequency e Start Time pelo admin, em Stores > Configuration > Catalog > XML Sitemap > Generation Settings, e salve.
Aproveite e olhe o Enable Submission to Robots.txt, logo abaixo. Ele também vem em 0, o que significa que a linha Sitemap: não entra no seu robots.txt.
3. O cron do grupo default está rodando?
O job se chama sitemap_generate e está declarado no grupo default. Pergunte para o banco quando ele rodou pela última vez:
SELECT job_code, status, scheduled_at, executed_at
FROM cron_schedule
WHERE job_code = 'sitemap_generate'
ORDER BY scheduled_at DESC
LIMIT 10;Nenhuma linha significa que o cron do Magento não está agendando nada. Linhas paradas em pending significam que ele agenda mas não executa. Linhas em error pedem uma olhada no var/log/cron.log.
Agora a parte que irrita: não existe comando de sitemap no bin/magento. O módulo Magento_Sitemap não traz nenhuma classe de console. Para gerar na hora, só pelo admin mesmo, no botão Generate da linha em Marketing > SEO & Search > Site Map.
Se você precisa disso num pipeline, o caminho é forçar o grupo inteiro com php bin/magento cron:run --group=default — lembrando que isso executa todos os jobs do grupo, não só o sitemap. Em servidor de produção, prefira o botão.
Com o sitemap voltando a atualizar, vale revisar o resto do básico de indexação no guia de SEO técnico para Magento 2 — sitemap com URL certa não resolve nada se o canonical estiver errado.
Perguntas rápidas
Meu sitemap tem produto que não existe mais. É problema do cron?
Não necessariamente. Se a geração está atualizando, o arquivo reflete o que o Magento considera visível hoje. Produto desabilitado ou fora do website continua saindo se ainda estiver marcado como visível na store view daquele sitemap.
Preciso de um sitemap por store view?
Sim, se cada store view tem URL própria. O registro na tabela é por store_id e o observer emula o ambiente de cada store antes de gerar. Use nomes de arquivo diferentes para não sobrescreverem um ao outro.
Onde o arquivo é gravado?
No caminho que você preencheu no registro, relativo à raiz pública da loja. Se você colocou barra no campo de caminho e sitemap.xml no nome, o arquivo sai como sitemap.xml na raiz do site.
Pra conferir na fonte
- XML sitemap — Adobe Experience League
- Magento_Sitemap etc/config.xml — GitHub
- Magento_Sitemap etc/crontab.xml — GitHub
- Magento_Sitemap Model/Observer.php — GitHub