Astro · Sortie statique ou serveur

Édition visuelle pour Astro, sur WordPress.

Sortie statique ou serveur, Leiho s’adapte aux deux : une requête à l’API de contenu par build, et un script qui ne se charge que dans l’éditeur.

  1. 01

    Autorisez l’éditeur à afficher votre site

    Définissez l’en-tête là où le site est hébergé.

    public/_headers · Netlify · Cloudflare Pages
    /*
      Content-Security-Policy: frame-ancestors 'self' https://cms.example.com
    vercel.json · Vercel
    {
      "headers": [
        {
          "source": "/(.*)",
          "headers": [
            { "key": "Content-Security-Policy", "value": "frame-ancestors 'self' https://cms.example.com" }
          ]
        }
      ]
    }
    src/middleware.ts · Serveur Node
    import { defineMiddleware } from 'astro:middleware';
    
    export const onRequest = defineMiddleware(async (_context, next) => {
      const response = await next();
      response.headers.set('Content-Security-Policy', "frame-ancestors 'self' https://cms.example.com");
      return response;
    });

    S’applique aux pages rendues à la demande. Les pages prérendues reçoivent leurs en-têtes de l’hébergeur.

  2. 02

    Ajoutez le bridge

    Installez le package, puis ajoutez ce script à votre layout de base. Astro l’intègre au bundle, et le bridge ne se télécharge que dans l’éditeur.

    Terminal
    npm install leiho
    src/layouts/Base.astro
    <head>
      <!-- … -->
      <script>
        if (window.self !== window.top) {
          import('leiho').then(({ initLeihoBridge }) => {
            initLeihoBridge({ wpOrigin: 'https://cms.example.com' });
          });
        }
      </script>
    </head>
  3. 03

    Lisez le contenu

    Chargez le contenu dans getStaticPaths : une requête par build.

    src/pages/[...path].astro
    ---
    import { loadLeihoContent, indexLeihoContent } from 'leiho/content';
    import Base from '../layouts/Base.astro';
    
    export async function getStaticPaths() {
      const { data } = await loadLeihoContent({ url: 'https://cms.example.com/wp-json/leiho/v1/export' });
      return indexLeihoContent(data).items.map((page) => ({
        params: { path: page.path.replace(/^\/|\/$/g, '') || undefined },
        props: { page },
      }));
    }
    
    const { page } = Astro.props;
    ---
    <Base title={page.title}>
      <main data-wp-post={page.id}>
        <h1 data-wp-field="_title">{page.title}</h1>
      </main>
    </Base>
  4. 04

    Marquez ce que les éditeurs peuvent modifier

    Appliquez field() sur chaque élément que les éditeurs doivent pouvoir modifier. Affichez toujours l’élément, même quand sa valeur est vide.

    .astro
    ---
    import { field, entry } from 'leiho';
    // field() writes data-wp-post + data-wp-field, entry() names a section.
    // Flexible content rows: block(page, 'sections', i, 'Label').
    ---
    <section {...entry(page, 'Hero')}>
      <h1 {...field(page, 'hero_title')}>{page.fields.hero_title}</h1>
      <img {...field(page, 'hero_image')} src={page.fields.hero_image?.url} alt={page.fields.hero_image?.alt} />
      {page.fields.cards?.map((card, i) => (
        <article {...field(page, `cards.${i}.title`)}>{card.title}</article>
      ))}
    </section>

Remplacez https://cms.example.com par l’adresse de votre WordPress. Dans wp-admin, Leiho → Démarrer affiche ces étapes avec votre adresse, vérifie chacune et peut confier toute l’installation à votre agent de code en une seule consigne.

Modifiez le vrai site.

Gratuit et open source. Essayez-le sur un vrai WordPress, dans votre navigateur.