Saltar al contenido

Ghost y Astro

Ghost es un sistema de gestión de contenidos (CMS) headless de código abierto creado sobre Node.js.

En esta sección, utilizaremos la API de contenido de Ghost para importar tus datos a tu proyecto de Astro.

Para empezar necesitarás tener lo siguiente:

  1. Un proyecto de Astro - Si aún no tienes un proyecto de Astro, nuestra guía de instalación te pondrá en marcha en poco tiempo.

  2. Un sitio de Ghost - Se asume que ya tienes un sitio configurado con Ghost. Si no es así, puedes configurar uno en un entorno local.

  3. Clave de API de contenido - Puedes crear una integración en la sección de tu sitio Settings > Integrations. Desde allí podrás encontrar tu clave de API de contenido

Para añadir las credenciales de tu sitio a Astro, crea un archivo .env en la raíz de tu proyecto con la siguiente variable:

.env
CONTENT_API_KEY=YOUR_API_KEY

Ahora deberías poder utilizar esta variable de entorno en tu proyecto.

Si deseas tener IntelliSense para tu variable de entorno, puedes crear un archivo env.d.ts en el directorio src/ y configurar ImportMetaEnv de esta manera:

src/env.d.ts
interface ImportMetaEnv {
readonly CONTENT_API_KEY: string;
}

Tu directorio raíz ahora debería incluir estos nuevos archivos:

  • Directoriosrc/
    • env.d.ts
  • .env
  • astro.config.mjs
  • package.json

Para conectarte con Ghost, instala el wrapper oficial de la API de contenido @tryghost/content-api usando el comando a continuación para tu gestor de paquetes preferido y, opcionalmente, un paquete útil que contenga las definiciones de tipos si estás usando TypeScript:

Ventana de la terminal
npm install @tryghost/content-api
npm install --save @types/tryghost__content-api

Con la configuración anterior, ahora puedes crear un blog que utilice Ghost como CMS.

  1. Un blog de Ghost
  2. Un proyecto de Astro integrado con la API de contenido de Ghost - Consulta la sección de integración con Astro para obtener más detalles sobre cómo configurar un proyecto de Astro con Ghost.

Este ejemplo creará una página de índice que lista las publicaciones con enlaces a páginas de publicaciones individuales generadas dinámicamente.

Puedes obtener los datos de tu sitio con el paquete de la API de contenido de Ghost.

Primero, crea un archivo ghost.ts bajo el directorio lib.

  • Directoriosrc/
    • Directoriolib/
      • ghost.ts
    • Directoriopages/
      • index.astro
  • astro.config.mjs
  • package.json

Inicializa una instancia de API con la API de Ghost usando la clave de API de la página de Integraciones del panel de Ghost.

src/lib/ghost.ts
import GhostContentAPI from '@tryghost/content-api';
// Create API instance with site credentials
export const ghostClient = new GhostContentAPI({
url: 'http://127.0.0.1:2368', // This is the default URL if your site is running on a local environment
key: import.meta.env.CONTENT_API_KEY,
version: 'v5.0',
});

La página src/pages/index.astro mostrará una lista de publicaciones, cada una con una descripción y un enlace a su propia página.

  • Directoriosrc/
    • Directoriolib/
      • ghost.ts
    • Directoriopages/
      • index.astro
  • astro.config.mjs
  • package.json

Importa ghostClient() en el frontmatter de Astro para usar el método posts.browse() para acceder a las publicaciones de blog de Ghost. Configura limit: all para recuperar todas las publicaciones.

src/pages/index.astro
---
import { ghostClient } from '../lib/ghost';
const posts = await ghostClient.posts
.browse({
limit: 'all',
})
.catch((err) => {
console.error(err);
});
---

La obtención a través de la API de contenido devuelve una matriz de objetos que contienen las propiedades de cada publicación como:

  • title - el título de la publicación
  • html - la representación HTML del contenido de la publicación
  • feature_image - la URL de origen de la imagen destacada de la publicación
  • slug - el slug de la publicación

Usa la matriz posts devuelta por la consulta para mostrar una lista de publicaciones de blog en la página.

src/pages/index.astro
---
import { ghostClient } from '../lib/ghost';
const posts = await ghostClient.posts
.browse({
limit: 'all',
})
.catch((err) => {
console.error(err);
});
---
<html lang="en">
<head>
<title>Astro + Ghost 👻</title>
</head>
<body>
{
posts.map((post) => (
<a href={`/post/${post.slug}`}>
<h1> {post.title} </h1>
</a>
))
}
</body>
</html>

La página src/pages/post/[slug].astro genera dinámicamente una página para cada publicación.

  • Directoriosrc/
    • Directoriolib/
      • ghost.ts
    • Directoriopages/
      • index.astro
      • Directoriopost/
        • [slug].astro
  • astro.config.mjs
  • package.json

Importa ghostClient() para acceder a las publicaciones de blog usando posts.browse() y devolver una publicación como props a cada una de tus rutas dinámicas.

src/pages/post/[slug].astro
---
import { ghostClient } from '../../lib/ghost';
export async function getStaticPaths() {
const posts = await ghostClient.posts
.browse({
limit: 'all',
})
.catch((err) => {
console.error(err);
});
return posts.map((post) => {
return {
params: {
slug: post.slug,
},
props: {
post: post,
},
};
});
}
const { post } = Astro.props;
---

Crea la plantilla para cada página usando las propiedades de cada objeto post.

src/pages/post/[slug].astro
---
import { ghostClient } from '../../lib/ghost';
export async function getStaticPaths() {
const posts = await ghostClient.posts
.browse({
limit: 'all',
})
.catch((err) => {
console.error(err);
});
return posts.map((post) => {
return {
params: {
slug: post.slug,
},
props: {
post: post,
},
};
});
}
const { post } = Astro.props;
---
<!DOCTYPE html>
<html lang="en">
<head>
<title>{post.title}</title>
</head>
<body>
<img src={post.feature_image} alt={post.title} />
<h1>{post.title}</h1>
<p>{post.reading_time} min read</p>
<Fragment set:html={post.html} />
</body>
</html>

Para desplegar tu sitio, visita nuestra guía de despliegue y sigue las instrucciones para tu proveedor de alojamiento preferido.

Más guías de CMS

Socios de CMS destacados

  • CloudCannon

    CMS basado en Git creado para mayor velocidad, seguridad y cero dolores de cabeza.

Todas las guías de CMS

Contribuir Comunidad Patrocinar