# /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 |
|------------|-----|----------|
| Google Keyword Planner | Volume, CPC | Volume mensal, competição |
| Ahrefs | KD, SERP analysis | Keyword Difficulty, DR necessário |
| Semrush | Concorrência | Gap analysis, trending |
| AnswerThePublic | Long-tail questions | Questões reais utilizadores |
| Google Trends | Sazonalidade | Tendência temporal |

### 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.
