As skills de SEO assentavam em quatro dependências, nenhuma operacional: SEO Tools API (localhost:3000, pasta inexistente em disco), Ahrefs MCP (nunca esteve em config), gsc e lighthouse (em disabledServers). Os seis passos da /seo-audit e o workflow inteiro da /seo-report apontavam para tooling morto — não eram executáveis. - seo-audit v3.0: ordem por custo (grátis → lote pago → unitário pago), gate de mercado (PT = 2620/pt) e gate de maxPages - seo-report v3.0: cobertura de crawl obrigatória no entregável - ferramentas-api.md: inventário das 24 ferramentas OpenSEO + tabela de migração endpoint a endpoint - implementacao-tecnica.md: striking distance, desperdício e filtro de ruído do GSC em código - seo-specialist v3.0: primary_mcps [openseo], bloco de MCPs desligados, FID → INP nos Core Web Vitals maxPages tem default 50: descomplicar.pt auditado com o default deu 25 URLs e 92 issues sem críticos; com maxPages 600 deu 1337 issues e 9 críticos. Documentado como gate — a fase Search Console dimensiona o crawl. Limitações declaradas nas skills: get_audit_issues devolve contagens sem URLs pela bridge MCP (structuredContent.issues não é entregue) e o whoami não expõe saldo de créditos em self-hosted.
274 lines
7.0 KiB
Markdown
274 lines
7.0 KiB
Markdown
# /seo-content-optimization - Structured Data e Meta Tags
|
|
|
|
## Meta Tags Essenciais 2026
|
|
|
|
```html
|
|
<!-- Title tag (50-60 caracteres) -->
|
|
<title>Keyword Principal | Nome Marca 2026</title>
|
|
|
|
<!-- Meta description (150-160 caracteres, CTA claro) -->
|
|
<meta name="description" content="Descrição apelativa com keyword, benefício claro e CTA subtil. Actualizado 2026.">
|
|
|
|
<!-- Canonical URL -->
|
|
<link rel="canonical" href="https://site.pt/pagina/">
|
|
|
|
<!-- Open Graph -->
|
|
<meta property="og:title" content="Título para Social (60 chars)">
|
|
<meta property="og:description" content="Descrição social (65 palavras max)">
|
|
<meta property="og:image" content="https://site.pt/og-image.jpg">
|
|
<meta property="og:url" content="https://site.pt/pagina/">
|
|
<meta property="og:type" content="article">
|
|
|
|
<!-- Twitter Card -->
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="twitter:title" content="Título Twitter">
|
|
<meta name="twitter:description" content="Descrição Twitter">
|
|
<meta name="twitter:image" content="https://site.pt/twitter-image.jpg">
|
|
|
|
<!-- 2026: Article metadata -->
|
|
<meta property="article:published_time" content="2026-02-03T10:00:00Z">
|
|
<meta property="article:modified_time" content="2026-02-03T15:30:00Z">
|
|
<meta property="article:author" content="Nome Autor">
|
|
```
|
|
|
|
---
|
|
|
|
## Structured Data (Schema.org) 2026
|
|
|
|
### Organization (Homepage)
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Organization",
|
|
"name": "Nome Empresa",
|
|
"url": "https://site.pt",
|
|
"logo": "https://site.pt/logo.png",
|
|
"sameAs": [
|
|
"https://linkedin.com/company/...",
|
|
"https://facebook.com/...",
|
|
"https://instagram.com/..."
|
|
],
|
|
"contactPoint": {
|
|
"@type": "ContactPoint",
|
|
"telephone": "+351-XXX-XXX-XXX",
|
|
"contactType": "Customer Service",
|
|
"areaServed": "PT",
|
|
"availableLanguage": ["pt", "en"]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Article/BlogPosting (E-E-A-T compliant)
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Article",
|
|
"headline": "Título do Artigo",
|
|
"author": {
|
|
"@type": "Person",
|
|
"name": "Nome Autor",
|
|
"url": "https://site.pt/autor/nome",
|
|
"jobTitle": "Especialista em...",
|
|
"knowsAbout": ["Área 1", "Área 2"]
|
|
},
|
|
"publisher": {
|
|
"@type": "Organization",
|
|
"name": "Nome Empresa",
|
|
"logo": {
|
|
"@type": "ImageObject",
|
|
"url": "https://site.pt/logo.png"
|
|
}
|
|
},
|
|
"datePublished": "2026-02-03",
|
|
"dateModified": "2026-02-03",
|
|
"image": "https://site.pt/imagem.jpg",
|
|
"wordCount": 1500,
|
|
"inLanguage": "pt-PT"
|
|
}
|
|
```
|
|
|
|
### FAQPage (featured snippets)
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "FAQPage",
|
|
"mainEntity": [
|
|
{
|
|
"@type": "Question",
|
|
"name": "Pergunta completa?",
|
|
"acceptedAnswer": {
|
|
"@type": "Answer",
|
|
"text": "Resposta completa e detalhada (min 40 palavras para snippets)."
|
|
}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### HowTo Schema (rich results 2026)
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "HowTo",
|
|
"name": "Como fazer X",
|
|
"description": "Guia completo passo a passo",
|
|
"totalTime": "PT30M",
|
|
"step": [
|
|
{
|
|
"@type": "HowToStep",
|
|
"name": "Passo 1",
|
|
"text": "Descrição detalhada passo 1",
|
|
"image": "https://site.pt/passo1.jpg"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### Review/Rating Schema (produtos)
|
|
|
|
```json
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Product",
|
|
"name": "Nome Produto",
|
|
"brand": { "@type": "Brand", "name": "Nome Marca" },
|
|
"aggregateRating": {
|
|
"@type": "AggregateRating",
|
|
"ratingValue": "4.8",
|
|
"reviewCount": "127"
|
|
},
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"price": "95.00",
|
|
"priceCurrency": "EUR",
|
|
"availability": "https://schema.org/InStock"
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Core Web Vitals 2026
|
|
|
|
| Métrica | Bom | Necessita Melhoria | Mau | Mudança 2026 |
|
|
|---------|-----|-------------------|-----|--------------|
|
|
| **LCP** | < 2.5s | 2.5-4s | > 4s | Threshold < 2.0s Q2 |
|
|
| **INP** | < 200ms | 200-500ms | > 500ms | Substituiu FID em Jan 2026 |
|
|
| **CLS** | < 0.1 | 0.1-0.25 | > 0.25 | Sem mudanças |
|
|
|
|
### Optimizações LCP
|
|
|
|
```html
|
|
<!-- Preload imagem hero -->
|
|
<link rel="preload" as="image" href="/hero.jpg" fetchpriority="high">
|
|
|
|
<!-- Lazy loading imagens below-fold -->
|
|
<img src="image.jpg" loading="lazy" alt="Descrição">
|
|
|
|
<!-- Responsive images -->
|
|
<img srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w"
|
|
sizes="(max-width: 600px) 480px, (max-width: 1000px) 800px, 1200px"
|
|
src="large.jpg" alt="Descrição">
|
|
|
|
<!-- WebP format -->
|
|
<picture>
|
|
<source srcset="image.webp" type="image/webp">
|
|
<img src="image.jpg" alt="Descrição">
|
|
</picture>
|
|
```
|
|
|
|
### Optimizações INP (novo 2026)
|
|
|
|
```javascript
|
|
// Debounce event handlers
|
|
function debounce(func, wait) {
|
|
let timeout;
|
|
return function executedFunction(...args) {
|
|
clearTimeout(timeout);
|
|
timeout = setTimeout(() => func(...args), wait);
|
|
};
|
|
}
|
|
|
|
// Code splitting
|
|
const component = () => import('./HeavyComponent.js');
|
|
|
|
// Web Workers para tarefas pesadas
|
|
const worker = new Worker('worker.js');
|
|
worker.postMessage({ task: 'heavy-computation', data });
|
|
```
|
|
|
|
### Optimizações CLS
|
|
|
|
```css
|
|
/* Definir width/height em imagens */
|
|
img {
|
|
width: 800px;
|
|
height: 600px;
|
|
aspect-ratio: 4 / 3;
|
|
}
|
|
|
|
/* Reservar espaço para ads */
|
|
.ad-container { min-height: 250px; }
|
|
|
|
/* Font loading */
|
|
@font-face {
|
|
font-family: 'Custom Font';
|
|
src: url('/font.woff2') format('woff2');
|
|
font-display: swap;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## URL Structure Best Practices
|
|
|
|
```
|
|
CORRECTO:
|
|
https://site.pt/categoria/keyword-principal/
|
|
https://site.pt/blog/como-fazer-energia-solar-2026/
|
|
|
|
ERRADO:
|
|
https://site.pt/p?id=123&cat=5&lang=pt
|
|
https://site.pt/este-url-e-muito-longo-com-muitas-palavras-desnecessarias/
|
|
```
|
|
|
|
**Regras 2026:**
|
|
- Máximo 60 caracteres
|
|
- Hífens (não underscores)
|
|
- Lowercase
|
|
- Keyword no início se possível
|
|
- Sem stop words quando possível
|
|
|
|
---
|
|
|
|
## Keyword Research
|
|
|
|
### Ferramentas
|
|
|
|
| Ferramenta | Uso | Métricas | Custo |
|
|
|------------|-----|----------|-------|
|
|
| **OpenSEO** `get_keyword_metrics` | Hidratar até 700 keywords conhecidas | Volume, KD, intenção, CPC, tendência | pago (lote) |
|
|
| **OpenSEO** `research_keywords` | Descobrir keywords novas (1-5 seeds) | Volume, KD, ideias relacionadas | pago (~30-100/seed — estimativa do schema, não medida) |
|
|
| **OpenSEO** `get_search_console_performance` | O que já posiciona (dados próprios) | Cliques, impressões, CTR, posição | **grátis** |
|
|
| **OpenSEO** `get_ranked_keywords` | Keywords de um domínio (nosso ou concorrente) | Posição, volume, tráfego | pago |
|
|
| AnswerThePublic | Long-tail questions | Questões reais de utilizadores | grátis |
|
|
| Google Trends | Sazonalidade | Tendência temporal | grátis |
|
|
|
|
**Ordem obrigatória:** Search Console primeiro (grátis e são dados de primeira mão), só depois as pagas. Mercado PT: `locationCode: 2620`, `languageCode: "pt"`.
|
|
|
|
### Keyword Difficulty Benchmarks
|
|
|
|
| KD | Dificuldade | DR Necessário |
|
|
|----|-------------|---------------|
|
|
| 0-20 | Muito Fácil | < 20 |
|
|
| 21-40 | Fácil | 20-35 |
|
|
| 41-60 | Médio | 35-50 |
|
|
| 61-80 | Difícil | 50-70 |
|
|
| 81-100 | Muito Difícil | > 70 |
|
|
|
|
**Estratégia:** Começar por KD 0-40, escalar para 41-60 após DR > 35.
|