DataFirefly All in One SEO: documentação completa
Módulo SEO premium tudo-em-um para PrestaShop 8 e 9: meta dinâmicas, esquemas JSON-LD, mapa do site multi-idioma, redirecionamentos, 404, robots.txt inteligente, seguimento e analisador de conteúdo.
Suíte SEO premium tudo-em-um para PrestaShop 8 e 9: modelos de meta dinâmicos, esquemas JSON-LD completos, mapa do site XML multi-idioma, redirecionamentos, monitorização de 404, Open Graph e Twitter Cards, GA4 e GTM, robots.txt inteligente com bloqueio dos crawlers de IA e analisador de conteúdo, tudo num só módulo.
Pré-requisitos
- PrestaShop: 8.0 a 9.x
- PHP: 8.1 ou superior (8.2 e 8.3 recomendados)
- MySQL: 5.7+ ou MariaDB 10.3+
- Módulo productcomments (oficial do PrestaShop): opcional, necessário apenas para o AggregateRating nos produtos
- mod_rewrite ativo no servidor Apache (ou equivalente em Nginx), para os URL reescritos
id_shop. Pode ter configurações completamente diferentes em cada loja.Instalação
- Descarregue o ficheiro
dfallinoneseo-vX.Y.Z.zipa partir da sua conta de cliente DataFirefly. - Inicie sessão no back-office do PrestaShop.
- Vá a Módulos → Gestor de módulos.
- Clique em Carregar um módulo, no canto superior direito.
- Arraste o ficheiro ZIP ou clique em Selecionar um ficheiro.
- A instalação cria automaticamente as 11 tabelas SQL, regista os hooks e acrescenta o menu Melhorar → DataFirefly SEO.
Primeira configuração em 10 minutos
Este percurso rápido permite-lhe configurar o essencial antes do primeiro rastreio do Google.
- Definições → Geral: ative o módulo, preencha o nome do site e a designação de «Início» para a navegação estruturada.
- Meta e modelos: defina, no mínimo, um modelo de Produto e um modelo de Categoria (ver a secção dedicada).
- Schema → Identidade da organização: preencha logótipo, telefone, e-mail, morada e URL das redes sociais (
sameAs). - Mapa do site: ative-o e clique em Gerar agora.
- Seguimento: acrescente o seu Measurement ID do GA4 e/ou o ID do GTM.
- Seguimento → Verificações: cole o valor de verificação da Google Search Console.
- Robots.txt: clique em Carregar as predefinições (PS + bloqueio de IA), para partir de uma base saudável.
Modelos de meta
O módulo substitui o preenchimento manual de meta_title e meta_description por modelos dinâmicos por tipo de entidade. Ao gravar uma ficha com as meta vazias, é aplicado automaticamente o modelo correspondente.
Tipos de entidade suportados
- Produto: fichas de produto (de todos os tipos, incluindo virtuais e packs)
- Categoria: páginas de categoria
- Página CMS: páginas de conteúdo estático
- Marca / Fabricante: páginas de fabricante
- Fornecedor: páginas de fornecedor
- Início: página inicial da loja
- Páginas genéricas:
/contact,/sitemape outras
Tokens disponíveis
Os tokens são substituídos pelos valores reais na apresentação da página. Nem todos os tokens estão disponíveis em todos os tipos de entidade.
{shop_name}: nome da loja{sep}: separador (por predefinição,|){product_name}: nome do produto (idioma atual){product_reference}: referência interna{product_sku}: alias da referência{product_ean13}: código de barras EAN13{product_brand},{brand}: marca ou fabricante{category}: categoria predefinida (produto) ou nome da categoria (página de categoria){category_parent}: nome da categoria mãe{category_description}: descrição curta (máximo de 160 caracteres){short_description}: descrição curta do produto (máximo de 160 caracteres){price}: preço com IVA, formatado com a moeda{price_tax_excl}: preço sem IVA, formatado{title}: título da página CMS{summary}: extrato do conteúdo CMS (máximo de 160 caracteres)
Blocos condicionais
Para não mostrar um token vazio, use a sintaxe condicional:
{?product_brand}{product_brand} | {/?}{product_name} - {shop_name}
Se product_brand estiver vazio (produto sem marca), todo o bloco entre {?token} e {/?} é removido. Caso contrário, o conteúdo é apresentado e os tokens lá dentro são substituídos normalmente.
Exemplos de modelos recomendados
Produto:
Title: {?product_brand}{product_brand} {/?}{product_name} - {category} | {shop_name}
Description: Descubra {product_name}{?product_brand} da {product_brand}{/?}. {short_description} Entrega rápida na {shop_name}.
Categoria:
Title: {category} - {?category_parent}{category_parent} - {/?}{shop_name}
Description: Todos os produtos da categoria {category} na {shop_name}. {category_description}
Início:
Title: {shop_name} - Loja online
Description: Bem-vindo à {shop_name}. Descubra o nosso catálogo, com entrega rápida e pagamento seguro.
Substituição por entidade
Para substituir uma ficha específica (por exemplo, um produto emblemático), clique no ícone Substituição de meta no menu Edição em massa, ou use o URL:
?controller=AdminDfSeoMeta&entity=product&entity_id=42
A página de substituição permite definir meta_title, meta_description, a diretiva robots (noindex,follow, por exemplo) e um canonical personalizado, por idioma.
Esquemas JSON-LD
O módulo gera um bloco @graph único, que reúne todos os esquemas da página atual, validado no Rich Results Test do Google.
Esquemas gerados automaticamente
- Organization: em todas as páginas, com a identidade da empresa
- WebSite: na página inicial, com
SearchActionpara ativar a caixa de pesquisa nos sitelinks - LocalBusiness: se estiver preenchida uma morada física
- BreadcrumbList: navegação estruturada
- Product: nas fichas de produto, com
offers,priceValidUntil,gtin13/isbn/mpn - AggregateRating: agregada a partir do módulo oficial productcomments
- Article: nas páginas CMS
- FAQPage: a partir dos blocos de FAQ de produto ou de página
Identidade da organização
Separador Schema → Identidade da organização. Campos a preencher:
- Tipo: Organization, Corporation, LocalBusiness, Store, OnlineStore, OnlineBusiness
- Logótipo: URL absoluto (recomendado 600×60 no mínimo, em proporção quadrada ou horizontal)
- Telefone e E-mail: usados em
contactPoint - Morada postal: rua, código postal, localidade e país (ISO-2)
- sameAs: um URL por linha (Facebook, Instagram, LinkedIn, Twitter/X e outros)
PT em ISO-2. Se vende a partir de uma morada física aberta ao público, o tipo Store ou LocalBusiness dá-lhe acesso a resultados enriquecidos locais que o tipo Organization não dá.Validade das ofertas de produto
O campo Validade das ofertas de produto (dias) controla o valor de priceValidUntil em Product.offers. Por predefinição, são 60 dias. O Google exige este campo para mostrar o preço nos resultados enriquecidos.
Esquemas personalizados
Separador Schema → Esquemas personalizados. Permite acrescentar blocos JSON-LD à medida (HowTo, Recipe, Event, JobPosting, VideoObject, Course e outros) num âmbito preciso:
- global: todas as páginas
- home: apenas a página inicial
- product: todas as páginas de produto
- product_id: um produto concreto (usa o campo de ID)
- category, category_id: o mesmo para categorias
- cms, cms_id: o mesmo para páginas CMS
Variáveis disponíveis no JSON personalizado: {shop_name}, {base_url}, {entity_id} e {entity_type}.
@graph. Valide-o com o Rich Results Test antes de publicar. Um JSON inválido é rejeitado silenciosamente.Mapa do site XML
O módulo gera um mapa do site XML conforme à especificação sitemaps.org, com hreflang em cada URL e suporte de imagens. A arquitetura é a de um índice de mapa do site por loja, e depois um mapa por tipo de entidade e por idioma, dividido em blocos.
Configuração
Separador Mapa do site. Ative-o e assinale depois o conteúdo a incluir:
- Produtos (por predefinição, todos os produtos ativos)
- Categorias
- Páginas CMS
- Marcas / Fabricantes
- Fornecedores
- Imagens (acrescenta
image:imagea cada URL de produto) - Vídeos (se existirem nas fichas)
Opções adicionais:
- Excluir as ruturas: retira os produtos sem stock
- Gzip: gera também as variantes
.xml.gz(reduz 5 a 10 vezes o tamanho descarregado pelos crawlers) - URL por ficheiro: dimensão do bloco (recomendado entre 5000 e 10000, com um máximo de 50000 por especificação XML)
Nova geração
A geração é manual, a partir do back-office, para evitar carga imprevista no servidor. Clique em Gerar agora.
Para automatizar, agende um cron que chame o script seguinte (de 6 em 6 ou de 12 em 12 horas, conforme a frequência de atualização do seu catálogo):
0 */6 * * * php /var/www/html/index.php fc=module&module=dfallinoneseo&controller=sitemap&action=rebuild
Submissão aos motores
Clique em Notificar os motores para avisar o Google e o Bing (endpoints antigos, mas ainda ativos). Para a Google Search Console, submeta o URL do índice do mapa do site uma vez por todas em GSC → Sitemaps. A GSC volta a rastrear automaticamente a cada alteração.
URL do índice do mapa do site: https://a-sua-loja.pt/sitemap.xml
Mapa do site HTML público
É gerado automaticamente um mapa do site em HTML, legível por pessoas, em /plan-du-site. Agrega categorias (em árvore), páginas CMS, marcas, fornecedores e os 200 produtos mais recentes. É útil para as ligações internas e para a acessibilidade.
/mapa-do-site nas definições de SEO antes de o URL ser indexado.Redirecionamentos
O módulo trata os redirecionamentos HTTP 301 (permanente), 302 (temporário), 307, 308 e 410 (Gone), com três tipos de correspondência.
Tipos de correspondência
- Exata: o URL de origem tem de corresponder exatamente (sem a query string)
- Prefixo: o URL de origem é um prefixo do URL pedido. O sufixo é conservado no destino se a opção Conservar a query string estiver assinalada. É útil para migrar pastas inteiras (
/pasta-antiga/para/pasta-nova/). - Regex: expressão regular do PHP (modo
~...~i, sensível ou insensível a maiúsculas). Os grupos de captura ficam disponíveis no destino através de$1,$2e assim por diante.
Criação manual
Separador Redirecionamentos → Novo redirecionamento. Campos:
- URL de origem: caminho sem o domínio (por exemplo,
/pagina-antiga) - URL de destino: caminho ou URL absoluto. Deixe vazio para um código 410.
- Tipo de correspondência, Código HTTP e Conservar a query string
Importação e exportação CSV
Formato CSV esperado (com cabeçalho):
source,destination,type,code
/produto-antigo,/produto-novo,exact,301
/pasta-antiga/,/pasta-nova/,prefix,301
/old-(.*),/new-$1,regex,301
A exportação CSV retoma os redirecionamentos que estiverem filtrados na lista.
Redirecionamento automático na mudança de slug
Se a opção Definições → Monitorização → Redirecionamento 301 automático em caso de mudança de URL estiver assinalada, o módulo cria uma 301 automaticamente quando altera o slug de um produto, de uma categoria, de uma página CMS, de uma marca ou de um fornecedor. O created_by fica então marcado como auto:urlchange, para distinção.
promocoes e não promoções), como é convenção no PrestaShop.Monitorização de 404
Separador Monitor 404. Capta todos os URL com erro 404 servidos pelo PrestaShop, com eliminação de duplicados, contagem de acessos, deteção de robôs e hash dos endereços IP (com o sal COOKIE_KEY do PrestaShop, para conformidade com o RGPD).
Filtros disponíveis
- Por resolver: URL sem redirecionamento que os cubra (vista predefinida)
- Resolvidas: URL para os quais foi criado um redirecionamento depois
- Robôs: acessos vindos de user-agents identificados como robôs
- Todas
Criar um redirecionamento com um clique
Em cada linha, o botão Redirecionar abre um formulário embutido, que preenche previamente a origem. Introduza o destino, escolha o código HTTP e confirme. A 404 é automaticamente marcada como resolvida.
Limpeza e manutenção
O menu Definições → Monitorização expõe um limite de Número máximo de entradas 404 conservadas (5000 por predefinição). Acima disso, o botão Limpar as 404 antigas elimina as entradas por resolver mais antigas.
Robots.txt dinâmico
O módulo serve um ficheiro /robots.txt gerado dinamicamente a cada pedido, com base nas regras definidas em Robots.txt.
Predefinições do PrestaShop e bloqueio de IA
O botão Carregar as predefinições (PS + bloqueio de IA) substitui todas as regras atuais e carrega uma predefinição saudável, que:
- Bloqueia os diretórios sensíveis do PrestaShop (
/admin*/,/cache/,/classes/e outros) - Bloqueia as páginas técnicas (
/cart,/order,/my-accounte outras) - Bloqueia os principais crawlers de IA que não respeitam as regras: GPTBot, ClaudeBot, CCBot, Google-Extended e anthropic-ai
- Aponta para o mapa do site (
Sitemap: /sitemap.xml)
Regras personalizadas
Cada regra tem um user-agent, uma diretiva (Allow, Disallow, Crawl-delay), um valor e uma posição (ordem no ficheiro). Ative e desative uma regra sem a eliminar, através do interruptor.
Pré-visualização em direto
O bloco Pré-visualização do ficheiro gerado, no fundo da página, mostra o robots.txt tal como será servido, antes da publicação.
Ficheiro llms.txt nativo
O módulo serve um ficheiro /llms.txt conforme à especificação llmstxt.org. Este ficheiro lista, em markdown, as secções principais do site, para os crawlers de IA respeitadores que preferem uma vista estruturada a recolher todo o HTML.
Não é preciso qualquer configuração: o módulo gera automaticamente o ficheiro a partir da sua árvore de categorias, páginas CMS e marcas.
Open Graph e Twitter Cards
Separador Social. O módulo injeta as etiquetas og:* e twitter:* em todas as páginas.
Definições
- Ativar Open Graph e Twitter Cards: interruptor principal
- og:locale automático: calculado a partir do idioma do contexto (por exemplo,
pt_PT) - Imagem OG predefinida: URL absoluto de uma imagem 1200×630 (usada quando a página não tem imagem própria)
- og:site_name e og:type predefinidos
- @handle do Twitter e tipo de cartão (
summaryousummary_large_image) - fb:app_id: App ID do Facebook
Seguimento: GA4, GTM e pixéis
GA4 e Enhanced Ecommerce
Campo GA4 Measurement ID: formato G-XXXXXXXXXX. Validação automática do formato.
Assinale Enhanced Ecommerce para ativar os eventos view_item, view_item_list, add_to_cart, remove_from_cart, begin_checkout, add_payment_info e purchase.
Assinale Respeitar o Consent Mode v2 para anonimizar os acessos até ao consentimento explícito (compatível com as CMP correntes).
Google Tag Manager
Campo GTM ID: formato GTM-XXXXXXX. O módulo injeta o snippet do GTM no head e o recurso noscript logo a seguir à abertura do body.
Pixéis publicitários
- Facebook Pixel ID: 15 dígitos
- TikTok Pixel ID: alfanumérico
Se o Consent Mode v2 estiver ativo, estes pixéis só disparam depois do consentimento.
Verificações de propriedade
Cole os valores das etiquetas de verificação (sem a etiqueta meta completa, apenas o conteúdo do atributo content):
- Google Search Console
- Bing Webmaster Tools
- Yandex Webmaster
- Baidu
Código personalizado no head e no fim do body
Dois campos livres aceitam HTML e JS arbitrários:
- Código injetado no head: para scripts de terceiros e meta complementares
- Código injetado imediatamente antes do fecho do body: ideal para widgets de conversa, retargeting tardio e scripts assíncronos
Analisador de conteúdo
Separador Analisador. Submeta um produto, uma categoria, uma página CMS ou HTML em bruto ao analisador, para obter um resultado SEO global e o detalhe das métricas.
Métricas calculadas
- Resultado SEO global (0 a 100): ponderação dos vários controlos
- Legibilidade Flesch: aproximação multi-idioma (contagem de sílabas por grupos de vogais)
- Número de palavras e número de frases
- Densidade da palavra-chave principal (em %)
- Ligações internas, externas e nofollow
- Imagens sem atributo alt
- Estrutura dos títulos H1 a H6
- Presença da palavra-chave no slug e no primeiro parágrafo
Verificações
O analisador devolve uma lista de verificações com o estado good, warn ou bad:
- Comprimento do title (50 a 60 caracteres)
- Comprimento da meta description (140 a 160 caracteres)
- Presença e comprimento do slug
- Comprimento do corpo (mínimo de 300 palavras)
- Presença de pelo menos uma imagem com alt
- Palavra-chave no title, no primeiro parágrafo e no slug
- Densidade da palavra-chave entre 0,5 % e 2,5 %
- Pelo menos um H1 e vários H2/H3
Edição em massa
Separador Edição em massa. Grelha paginada (30 entradas por página), com filtros, para alterar rapidamente meta_title, meta_description e link_rewrite em produtos, categorias ou páginas CMS.
Filtros disponíveis
- Todas
- Sem title: apenas as entradas com meta_title vazio
- Sem description: apenas as entradas com meta_description vazia
- Pesquisa por nome
Aplicar os modelos em massa
O botão Aplicar os modelos aplica automaticamente o modelo definido para o tipo de entidade atual às fichas que correspondem aos filtros. Assinale Aplicar apenas aos campos vazios para não sobrepor as meta já preenchidas.
Metabox de SEO na ficha de produto
Na página de edição de um produto no back-office, é acrescentado um painel DataFirefly SEO com:
- Um resultado SEO em direto (7 controlos: comprimento do title, da description, do slug e do corpo, imagem, EAN13 e marca)
- Uma pré-visualização SERP do Google, apresentada com fidelidade
- A palavra-chave principal detetada
Definições avançadas
Indexação
Separador Definições → Indexação:
- hreflang multi-idioma: gera as etiquetas
link rel="alternate"em todas as páginas - Estratégia de x-default: Idioma predefinido (recomendado), Inglês ou Desativado
- URL canonical: injeta
link rel="canonical" - Canonical nas paginações: Na página atual (recomendado), Sempre na página 1 ou Sem canonical
- noindex automáticos: páginas /search, carrinho, a minha conta, novidades, mais vendidos, promoções e facetas
- Canonical para a página mãe nas facetas: evita o conteúdo duplicado da navegação por facetas
Imagens
- Geração automática dos atributos alt: ao gravar uma imagem sem alt, aplica o modelo
- Modelo de alt: por predefinição,
{product_name} - {shop_name} - Lazyload nativo das imagens: acrescenta
loading="lazy"edecoding="async"a todas as imagens, com recurso ao IntersectionObserver para as imagens emdata-src
Manutenção
- Limpar a cache: purga a cache do Smarty e a cache do PrestaShop
- Limpar as 404 antigas: aplica o limite configurado
- Exportar todos os dados (JSON): descarrega um ficheiro JSON com todas as tabelas de SEO da loja atual (útil para migrar entre ambientes ou para uma cópia de segurança antes da desinstalação)
Multiloja
Todas as funcionalidades estão delimitadas por id_shop. Ao mudar de loja através do seletor de contexto do PrestaShop, vê e altera apenas os dados dessa loja.
Casos particulares a conhecer:
- Modelos: um modelo por par de tipo de entidade e loja. Defina explicitamente os modelos para cada loja.
- Mapa do site: um índice distinto por loja, acessível em
https://loja-1.pt/sitemap.xml,https://loja-2.pt/sitemap.xmle assim por diante - Robots.txt: regras por loja, servidas no domínio correspondente
- Redirecionamentos: por loja
- Esquemas personalizados: por loja
Resolução de problemas
O mapa do site não é gerado
- Confirme que a pasta
modules/dfallinoneseo/sitemaps/é acessível para escrita pelo PHP - Verifique as permissões:
chmod 755 modules/dfallinoneseo/sitemaps/ - Aumente o
max_execution_timeno php.ini se tiver mais de 50 000 produtos
Os esquemas JSON-LD não aparecem
- Confirme que o módulo está ativo (Definições → Geral)
- Confirme que o tipo de esquema em causa está ativo (Schema → Tipos de esquemas gerados)
- Limpe a cache do PrestaShop
- Inspecione o código HTML: os esquemas são injetados num bloco
script type="application/ld+json"
Os redirecionamentos 301 não funcionam
- Confirme que o módulo está instalado e ativo
- Confirme que os redirecionamentos estão marcados como ativos
- Nas regex, teste a sua expressão em regex101.com, em modo PCRE
- A ordem de prioridade é: exata, prefixo, regex (por
hit_countdecrescente)
O GA4 ou o GTM não são injetados
- Verifique o formato do ID (
G-XXXXXXXouGTM-XXXXXXX) - Se o Consent Mode v2 estiver ativo, o snippet fica em modo «denied» por predefinição até ao consentimento. Verifique a camada da CMP.
- Inspecione o
headda página: o snippet do GA4 ou do GTM é injetado imediatamente antes do fecho
O robots.txt não muda
- Confirme que não existe um ficheiro
robots.txtestático na raiz do site (teria prioridade sobre o módulo). Elimine-o. - O módulo serve o robots.txt através de uma rota do PrestaShop: confirme que os URL reescritos estão ativos
Erro na criação das tabelas SQL durante a instalação
- Confirme que o utilizador de MySQL tem permissões de
CREATEeALTER - Verifique a codificação: o MySQL tem de suportar
utf8mb4com a colaçãoutf8mb4_unicode_ci - Se o prefixo de tabela personalizado do PrestaShop tiver mais de 5 caracteres, alguns nomes de índice podem ultrapassar o limite de 64 caracteres do MySQL. Contacte o suporte.
Referência técnica
Hooks utilizados
O módulo regista 18 hooks:
displayHeader: injeção das meta, canonical, hreflang, OG, Twitter, JSON-LD, GA4/GTM e verificaçõesdisplayBeforeBodyClosingTag: injeção do noscript do GTM, do noscript do FB Pixel e do código personalizado de fim de bodydisplayBackOfficeHeader: CSS e JS do back-officedisplayAdminProductsExtra: metabox de SEO na ficha de produtoactionDispatcherBefore,actionDispatcherAfter: encaminhamento dos redirecionamentos e captura das 404actionObjectProductAddAfter,actionObjectProductUpdateAfter: preenchimento automático das meta e 301 automáticaactionObjectCategoryAddAfter,actionObjectCategoryUpdateAfter: o mesmo para categoriasactionObjectCmsAddAfter,actionObjectCmsUpdateAfter: o mesmo para CMSactionObjectManufacturerUpdateAfter,actionObjectSupplierUpdateAfter: 301 automática na mudança de slugactionAdminControllerSetMedia,actionFrontControllerSetMedia: recursos CSS e JSdisplayProductExtraContent: reservado para utilizações futurasmoduleRoutes: rotas/sitemap.xml,/plan-du-site,/robots.txte/llms.txt
Tabelas SQL acrescentadas
Todas as tabelas usam o prefixo df_seo_, o charset utf8mb4 e a colação utf8mb4_unicode_ci:
df_seo_meta,df_seo_meta_lang: substituições de meta por entidadedf_seo_template,df_seo_template_lang: modelos por tipodf_seo_redirect: redirecionamentos 301/302/307/308/410df_seo_404: registo das 404df_seo_score: instantâneos de resultado (analisador)df_seo_keyword: palavras-chave principaisdf_seo_robots_rule: regras do robots.txtdf_seo_schema_custom: esquemas JSON-LD personalizadosdf_seo_log: registo de diagnóstico interno
Desinstalação
A desinstalação elimina os hooks e os separadores de back-office, mas conserva as tabelas SQL e os dados. Para limpar por completo:
DROP TABLE ps_df_seo_meta, ps_df_seo_meta_lang, ps_df_seo_template, ps_df_seo_template_lang,
ps_df_seo_redirect, ps_df_seo_404, ps_df_seo_score, ps_df_seo_keyword,
ps_df_seo_robots_rule, ps_df_seo_schema_custom, ps_df_seo_log;
DELETE FROM ps_configuration WHERE name LIKE 'DFSEO_%';
Atualizações e suporte
- Atualizações: 12 meses incluídos na compra. Renovação anual opcional por 49 €.
- Suporte: 12 meses por e-mail, com resposta em 48 horas úteis.
- Changelog e transferência das últimas versões na sua conta de cliente DataFirefly.