---
name: shopify-auditoria-paginas-blog
description: "Solo lectura: lista todas las páginas y entradas de blog de la tienda y señala las que están vacías, tienen poco contenido o no tienen título ni descripción SEO. Úsala cuando quieras mejorar el SEO de tu contenido o después de cambiar de tema."
---

## Propósito
Revisa todas las páginas de la tienda y los artículos del blog en busca de contenido faltante o escaso (cuerpo corto, sin título o descripción SEO, cuerpo vacío). Los buscadores penalizan las páginas con poco contenido y además dan una mala experiencia al cliente. Solo lectura, sin mutaciones. Complementa a `shopify-auditoria-seo` (que cubre productos y colecciones).

## Requisitos
- Sesión autenticada de Shopify CLI: `shopify store auth --store <tu-tienda>.myshopify.com --scopes read_content`
- Las consultas se ejecutan con `shopify store execute`.
- Permisos (scopes) de API: `read_content`

## Parámetros

| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|-----------|------|-------------|----------------|-------------|
| store | string | sí | — | Dominio de la tienda (p. ej., mitienda.myshopify.com) |
| min_body_length | integer | no | 100 | Marca las páginas cuyo cuerpo tenga menos caracteres que este valor |
| include_unpublished | bool | no | false | Audita también las páginas y artículos sin publicar |
| format | string | no | human | Formato de salida: `human` o `json` |

## Seguridad

> ℹ️ Skill de solo lectura: no ejecuta mutaciones. Puedes usarla en cualquier momento sin riesgo.

## Pasos

1. **OPERACIÓN:** `pages` — consulta
   **Entradas:** `first: 250`, campos `title`, `body`, `bodySummary`, `seo`, `publishedAt`, cursor de paginación
   **Resultado esperado:** Todas las páginas con su contenido y sus datos SEO

2. **OPERACIÓN:** `articles` — consulta
   **Entradas:** `first: 250`, campos `title`, `body`, `seo`, `publishedAt`, `blog { title }`, cursor de paginación
   **Resultado esperado:** Todos los artículos del blog con su contenido

3. Marca: cuerpo vacío, cuerpo < `min_body_length`, sin título SEO, sin descripción SEO

## Operaciones GraphQL

```graphql
# pages:query — validada con api_version 2025-04
query PageContentAudit($after: String) {
  pages(first: 250, after: $after) {
    edges {
      node {
        id
        title
        handle
        publishedAt
        bodySummary
        body
        seoTitle: metafield(namespace: "global", key: "title_tag") { value }
        seoDescription: metafield(namespace: "global", key: "description_tag") { value }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

```graphql
# articles:query — validada con api_version 2025-04
query ArticleContentAudit($after: String) {
  articles(first: 250, after: $after) {
    edges {
      node {
        id
        title
        handle
        publishedAt
        body
        summary
        seoTitle: metafield(namespace: "global", key: "title_tag") { value }
        seoDescription: metafield(namespace: "global", key: "description_tag") { value }
        blog {
          id
          title
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

## Seguimiento de la sesión

**Claude DEBE mostrar lo siguiente en cada etapa. Es obligatorio.**

**Al iniciar**, muestra:
```
╔══════════════════════════════════════════════╗
║  SKILL: Auditoría de páginas y blog          ║
║  Tienda: <dominio de la tienda>              ║
║  Inicio: <AAAA-MM-DD HH:MM UTC>              ║
╚══════════════════════════════════════════════╝
```

**Después de cada paso**, muestra:
```
[N/TOTAL] <CONSULTA|MUTACIÓN>  <OperationName>
          → Parámetros: <resumen breve de las entradas clave>
          → Resultado: <cantidad o desenlace>
```

**Al terminar**, muestra:

Para `format: human` (predeterminado):
```
══════════════════════════════════════════════
AUDITORÍA DE CONTENIDO DE PÁGINAS
  Páginas revisadas:    <n>  |  Problemas: <n>
  Artículos revisados:  <n>  |  Problemas: <n>

  Problemas:
    Página: "<título>" — cuerpo vacío
    Artículo: "<título>" — sin descripción SEO
  Archivo: content_audit_<fecha>.csv
══════════════════════════════════════════════
```

Para `format: json`, muestra:
```json
{
  "skill": "shopify-auditoria-paginas-blog",
  "store": "<dominio>",
  "pages_scanned": 0,
  "articles_scanned": 0,
  "issues_found": 0,
  "output_file": "content_audit_<fecha>.csv"
}
```

## Formato de salida
Archivo CSV `content_audit_<AAAA-MM-DD>.csv` con las columnas:
`type`, `id`, `title`, `handle`, `published_at`, `body_length`, `has_seo_title`, `has_seo_description`, `issue`

## Manejo de errores
| Error | Causa | Solución |
|-------|-------|----------|
| `THROTTLED` | Se superó el límite de solicitudes de la API | Espera 2 segundos y reintenta hasta 3 veces |
| No hay páginas ni artículos | Tienda con muy poco contenido | Termina con 0 resultados |

## Buenas prácticas
- Los buscadores suelen considerar «contenido escaso» una página con menos de 300 palabras: usa `min_body_length: 1500` (caracteres ≈ unas 250 palabras) como umbral inicial.
- Las páginas Quiénes somos, Preguntas frecuentes y Contacto generan confianza y nunca deberían estar vacías: dales prioridad.
- Ejecútala después de cualquier migración de contenido o cambio de tema que pueda haber borrado el contenido de las páginas.
- Combínala con `shopify-auditoria-seo` para tener una auditoría SEO completa que cubra productos, colecciones, páginas y artículos del blog en un solo proceso.
