diff --git a/docs/GOOGLE-SEARCH-CONSOLE.md b/docs/GOOGLE-SEARCH-CONSOLE.md index e9a79e3..a615fd1 100644 --- a/docs/GOOGLE-SEARCH-CONSOLE.md +++ b/docs/GOOGLE-SEARCH-CONSOLE.md @@ -1,132 +1,34 @@ # Google Search Console Setup Guide -## Como registrar o Octto Engenharia no Google Search Console +## Como registrar no Google Search Console -### 1. Acessar Google Search Console -- Acesse: https://search.google.com/search-console -- Faça login com sua conta Google +1. Acesse: https://search.google.com/search-console +2. Clique em "Adicionar propriedade" +3. Digite: `octto-engenharia.com` +4. Escolha "DNS" para verificar +5. Copie o registro TXT que aparece +6. Acesse seu painel de DNS (HostGator, 1&1, etc) +7. Adicione o registro TXT +8. Volte ao Google e clique em "Verificar" +9. Aguarde indexação (pode levar horas) -### 2. Adicionar Propriedade -- Clique em "Adicionar propriedade" (Add property) -- Escolha "Domínio" e digite: `octto-engenharia.com` -- Clique em "Continuar" +## Enviar Sitemap -### 3. Verificar Propriedade (Método DNS) -A forma mais simples é via registro DNS: +Depois de verificado: +1. Vá para "Sitemaps" +2. Adicione: `https://octto-engenharia.com/sitemap.xml` +3. Google começa a indexar automaticamente -1. Você receberá um registro TXT como: - ``` - google-site-verification=xxxxxxxxxxxxxxxxxxxxx - ``` +## Verificar Indexação -2. Acesse seu painel de controle de DNS (onde seu domínio está hospedado) - -3. Adicione um registro TXT com o código fornecido - -4. Aguarde a propagação DNS (pode levar até 24h, mas geralmente é imediato) - -5. Clique em "Verificar" no Google Search Console - -### 4. Enviar Sitemap -- No Google Search Console, vá para "Sitemaps" -- Adicione: `https://octto-engenharia.com/sitemap.xml` -- Google começará a indexar automaticamente - -### 5. Verificar Indexação -- Vá para "Cobertura" (Coverage) para verificar quais páginas foram indexadas -- Procure por erros ou avisos -- As URLs em verde foram indexadas com sucesso - -### 6. Submeter URLs Manualmente (Opcional) -Se quiser acelerar a indexação: -- Vá para "Inspeção de URL" -- Digite a URL que quer indexar -- Clique em "Solicitar indexação" - -### 7. Monitorar Performance -- Acesse "Performance" para ver: - - CTR (Click-Through Rate) - - Impressões - - Posição média - - Cliques - ---- - -## Checklist de SEO Implementado - -✅ **Meta Tags** -- Title tags (único para cada página) -- Meta descriptions -- Meta keywords -- Open Graph tags (para compartilhamento social) -- Twitter Card tags - -✅ **Structured Data** -- schema.org JSON-LD ready -- Open Graph implementado - -✅ **Sitemap** -- `sitemap.xml` dinâmico -- Inclui todas as páginas principais -- Inclui todas as páginas de projetos -- Suporta múltiplas línguas (pt, en, es) - -✅ **robots.txt** -- Configurado para permitir indexação -- Direciona para sitemap -- Bloqueia /admin e /api - -✅ **URLs Amigáveis** -- URLs descritivas e em português -- Suporte a múltiplas línguas - -✅ **Performance** -- Next.js otimizado para SEO -- Imagens otimizadas com Image component -- CSS inline onde apropriado - ---- - -## Keywords Recomendadas - -Use estas palavras-chave no conteúdo: - -**Primárias:** -- Engenharia de movimentação de carga -- Projetos de içamento -- Laudos técnicos NR-11 -- Segurança do trabalho -- Adequação de equipamentos - -**Secundárias:** -- Inspeção de equipamentos -- Consultoria de segurança -- Projetos mecânicos -- Engenharia industrial -- Conformidade regulatória - ---- +- Vá para "Cobertura" para ver quais páginas foram indexadas +- URLs em verde = indexadas com sucesso +- Vermelho = problemas ## Próximos Passos -1. **Link Building**: Obter links de sites relevantes (engenharia, segurança) -2. **Local SEO**: Registrar no Google My Business -3. **Content**: Blog com artigos sobre segurança, normativas, casos de sucesso -4. **Social**: Compartilhar conteúdo em redes sociais -5. **Reviews**: Estimular clientes a deixarem avaliações +- Solicitar indexação de URLs específicas em "Inspeção de URL" +- Acompanhar em "Performance" depois de alguns dias +- Criar conteúdo com boas palavras-chave +- Compartilhar no Google My Business (para aparecer em buscas locais) ---- - -## Dúvidas Frequentes - -**P: Quanto tempo leva para aparecer no Google?** -R: Pode levar de 1 a 3 meses para indexação completa. Com bom SEO e backlinks, acelera. - -**P: Por que não aparece para minhas palavras-chave?** -R: Pode ser concorrência alta. Foque em long-tail keywords (ex: "laudos NR-11 Jundiaí"). - -**P: Preciso pagar para aparecer no Google?** -R: Não, SEO orgânico é grátis. Você pode usar Google Ads para aparecer no topo mais rápido (pago). - -**P: Que keywords devem ser prioritárias?** -R: Foco em "Engenharia de movimentação de carga [sua cidade]" e normativas (NR-11, NR-12). diff --git a/frontend/public/robots.txt b/frontend/public/robots.txt index e2982ae..5df9f6e 100644 --- a/frontend/public/robots.txt +++ b/frontend/public/robots.txt @@ -16,9 +16,9 @@ User-agent: Bingbot Allow: / # Sitemap -Sitemap: https://octto-engenharia.com/sitemap.xml -Sitemap: https://octto-engenharia.com/en/sitemap.xml -Sitemap: https://octto-engenharia.com/es/sitemap.xml +Sitemap: https://octtoengenharia.com.br/sitemap.xml +Sitemap: https://octtoengenharia.com.br/en/sitemap.xml +Sitemap: https://octtoengenharia.com.br/es/sitemap.xml # Crawl delay (optional) Crawl-delay: 1 diff --git a/frontend/src/app/[locale]/projetos/[id]/metadata.ts b/frontend/src/app/[locale]/projetos/[id]/metadata.ts new file mode 100644 index 0000000..e54e352 --- /dev/null +++ b/frontend/src/app/[locale]/projetos/[id]/metadata.ts @@ -0,0 +1,82 @@ +import { Metadata } from 'next'; + +interface Project { + id: string; + title: string; + description: string | null; + coverImage: string | null; + category: string; + client: string | null; + completionDate: string | null; +} + +async function getProject(id: string): Promise { + try { + const res = await fetch(`https://octtoengenharia.com.br/api/projects/${id}`, { + next: { revalidate: 3600 }, // Cache 1 hora + }); + if (res.ok) { + return await res.json(); + } + } catch (error) { + console.error('Erro ao buscar projeto para metadata:', error); + } + return null; +} + +export async function generateMetadata( + { params }: { params: { id: string; locale: string } }, + parent: any +): Promise { + const project = await getProject(params.id); + + if (!project) { + return { + title: 'Projeto não encontrado', + description: 'O projeto que você procura não existe.', + }; + } + + const baseUrl = 'https://octtoengenharia.com.br'; + const prefix = params.locale === 'pt' ? '' : `/${params.locale}`; + const projectUrl = `${baseUrl}${prefix}/projetos/${project.id}`; + const description = project.description || `Projeto de ${project.category} da Octto Engenharia${project.client ? ` para ${project.client}` : ''}`; + + const localeMap: Record = { + pt: 'pt_BR', + en: 'en_US', + es: 'es_ES', + }; + + return { + title: `${project.title} | Octto Engenharia`, + description, + keywords: `${project.title}, ${project.category}, engenharia, ${project.client || 'Octto Engenharia'}`, + openGraph: { + type: 'article', + title: project.title, + description, + url: projectUrl, + images: project.coverImage + ? [ + { + url: project.coverImage, + width: 1200, + height: 630, + alt: project.title, + }, + ] + : [], + locale: localeMap[params.locale] || 'pt_BR', + }, + twitter: { + card: 'summary_large_image', + title: project.title, + description, + images: project.coverImage ? [project.coverImage] : [], + }, + alternates: { + canonical: projectUrl, + }, + }; +} diff --git a/frontend/src/app/[locale]/projetos/[id]/page.tsx b/frontend/src/app/[locale]/projetos/[id]/page.tsx index fc790aa..69a0e4a 100644 --- a/frontend/src/app/[locale]/projetos/[id]/page.tsx +++ b/frontend/src/app/[locale]/projetos/[id]/page.tsx @@ -4,6 +4,7 @@ import Link from "next/link"; import { notFound } from "next/navigation"; import { useState, useEffect } from "react"; import { useLocale } from "@/contexts/LocaleContext"; +export { generateMetadata } from "./metadata"; interface Project { id: string; diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index 3f3a7fb..c9bc943 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -19,17 +19,17 @@ export const metadata: Metadata = { title: "Octto Engenharia | Movimentação de Carga e Segurança", description: "Especialistas em engenharia de movimentação de carga, projetos de dispositivos de içamento, laudos técnicos e adequação de equipamentos (NR-11/NR-12).", keywords: "engenharia, movimentação de carga, içamento, laudos técnicos, NR-11, NR-12, segurança do trabalho, projetos mecânicos", - metadataBase: new URL("https://octto-engenharia.com"), + metadataBase: new URL("https://octtoengenharia.com.br"), openGraph: { type: "website", locale: "pt_BR", - url: "https://octto-engenharia.com", + url: "https://octtoengenharia.com.br", siteName: "Octto Engenharia", title: "Octto Engenharia | Movimentação de Carga e Segurança", description: "Especialistas em engenharia de movimentação de carga, projetos de dispositivos de içamento, laudos técnicos e adequação de equipamentos.", images: [ { - url: "https://octto-engenharia.com/og-image.jpg", + url: "https://octtoengenharia.com.br/og-image.jpg", width: 1200, height: 630, alt: "Octto Engenharia", @@ -54,9 +54,9 @@ export const metadata: Metadata = { }, alternates: { languages: { - "pt-BR": "https://octto-engenharia.com/pt", - en: "https://octto-engenharia.com/en", - es: "https://octto-engenharia.com/es", + "pt-BR": "https://octtoengenharia.com.br/pt", + en: "https://octtoengenharia.com.br/en", + es: "https://octtoengenharia.com.br/es", }, }, }; diff --git a/frontend/src/app/sitemap.ts b/frontend/src/app/sitemap.ts index 413cd12..851034e 100644 --- a/frontend/src/app/sitemap.ts +++ b/frontend/src/app/sitemap.ts @@ -1,7 +1,7 @@ import { MetadataRoute } from 'next'; export default async function sitemap(): Promise { - const baseUrl = 'https://octto-engenharia.com'; + const baseUrl = 'https://octtoengenharia.com.br'; const locales = ['', '/en', '/es']; // Páginas principais diff --git a/frontend/src/components/JsonLdScript.tsx b/frontend/src/components/JsonLdScript.tsx index e97e7f2..cb90dea 100644 --- a/frontend/src/components/JsonLdScript.tsx +++ b/frontend/src/components/JsonLdScript.tsx @@ -6,9 +6,9 @@ export function JsonLdScript() { '@type': 'LocalBusiness', name: 'Octto Engenharia', description: 'Especialistas em engenharia de movimentação de carga e segurança do trabalho', - url: 'https://octto-engenharia.com', - logo: 'https://octto-engenharia.com/logo.png', - image: 'https://octto-engenharia.com/og-image.jpg', + url: 'https://octtoengenharia.com.br', + logo: 'https://octtoengenharia.com.br/logo.png', + image: 'https://octtoengenharia.com.br/og-image.jpg', telephone: '+55 13 99803-0036', email: 'contato@octto-engenharia.com', areaServed: { @@ -41,25 +41,25 @@ export function JsonLdScript() { { '@type': 'CollectionPage', name: 'Projetos', - url: 'https://octto-engenharia.com/projetos', + url: 'https://octtoengenharia.com.br/projetos', description: 'Portfólio de projetos de engenharia de movimentação de carga', }, { '@type': 'CollectionPage', name: 'Serviços', - url: 'https://octto-engenharia.com/servicos', + url: 'https://octtoengenharia.com.br/servicos', description: 'Serviços especializados em engenharia e segurança do trabalho', }, { '@type': 'AboutPage', name: 'Sobre', - url: 'https://octto-engenharia.com/sobre', + url: 'https://octtoengenharia.com.br/sobre', description: 'Conheça mais sobre a Octto Engenharia', }, { '@type': 'ContactPage', name: 'Contato', - url: 'https://octto-engenharia.com/contato', + url: 'https://octtoengenharia.com.br/contato', description: 'Entre em contato com a Octto Engenharia', }, ], diff --git a/frontend/src/components/WhatsAppButton.tsx b/frontend/src/components/WhatsAppButton.tsx index d418bcb..d07082b 100644 --- a/frontend/src/components/WhatsAppButton.tsx +++ b/frontend/src/components/WhatsAppButton.tsx @@ -6,30 +6,38 @@ import { useState, useEffect } from 'react'; export default function WhatsAppButton() { const { t } = useLanguage(); - const [whatsappLink, setWhatsappLink] = useState('https://wa.me/5535988229445'); + const [whatsappLink, setWhatsappLink] = useState('https://wa.me/5513998030036'); + const [mounted, setMounted] = useState(false); useEffect(() => { - // Busca o número do WhatsApp do CMS - fetch('/api/contact-info') + setMounted(true); + + // Busca o número do WhatsApp das configurações + fetch('/api/settings') .then(res => res.json()) .then(data => { - if (data.whatsappLink) { - setWhatsappLink(data.whatsappLink); + if (data.whatsapp) { + const cleanNumber = data.whatsapp.replace(/\D/g, ''); + setWhatsappLink(`https://wa.me/${cleanNumber}`); } }) .catch(console.error); }, []); + if (!mounted) { + return null; + } + return ( - - + + {t('whatsapp.label')}