flexweg-import (must-use)

fournit l'import en masse de posts et pages depuis deux formats source :

flexweg-import fournit l'import en masse de posts et pages depuis deux formats source :

  • Fichiers markdown avec YAML frontmatter — drop un dossier de fichiers .md
  • Exports XML WordPress (WXR) — upload d'un .xml exporté depuis wp-admin/export.php

Les imports auto-créent les catégories / tags (en préservant la hiérarchie WP), uploadent les images référencées dans la médiathèque (en réécrivant les URLs d'images dans le corps pour matcher), et matchent les auteurs aux utilisateurs CMS existants par email.

Le plugin est must-use pour pouvoir évoluer indépendamment du reste de l'admin sans churn dans la liste des plugins.

Page de réglages

/settings/plugin/flexweg-import — c'est l'UI principale du plugin.

Modes

Deux modes d'import :

  • Drag and drop — drag d'un dossier complet (avec images dedans). Workflow recommandé.
  • WordPress XML upload — upload d'un fichier .xml WXR.

Status mode

Trois options pour le statut des posts importés :

  • Always import as draft (recommandé) — tous les posts importés sont en brouillon. Vous bulk-publish après vérification.
  • Always online — tous les posts sont auto-publiés. Plus rapide mais plus risqué (les erreurs de publication arrivent en chaîne).
  • Preserve source status — utilise le status du frontmatter (markdown) ou du WP XML.

Bouton Scan

Avant l'import, un Scan analyse le dossier / XML et affiche un aperçu :

  • Nombre de posts / pages à créer
  • Nombre de catégories / tags à créer (nouveaux + existants)
  • Nombre d'images à uploader
  • Liste des auteurs trouvés (matched vs unmatched)

Bouton Confirm import

Lance l'import. Une barre de progression montre l'avancement. À la fin, un résumé liste les créés / skippés / errors.

Format markdown avec frontmatter

MARKDOWN
---
title: My first post
slug: my-first-post
type: post                      # or "page"
status: draft                   # or "online" (overridden by status mode)
category: Recipes               # auto-créé si manquant
tags: [pasta, italian, weeknight]
heroImage: 01-hero.jpg          # nom de fichier dans images/
author: [email protected]        # matché contre les users CMS existants ; fallback à l'importeur
publishedAt: 2026-05-01
excerpt: "Un résumé d'une ligne utilisé par les listings."
seoTitle: Titre SEO personnalisé
seoDescription: Description SEO personnalisée
---

Corps markdown ici. Titres, listes, liens, images — tout ce que `marked` supporte.

Champs du frontmatter

Champ Obligatoire Description
title oui Titre du post
slug non Calculé auto depuis le titre si absent
type non post (défaut) ou page
status non draft (défaut) ou online
category non Nom de catégorie ; auto-créée si manquante
tags non Liste de noms ; auto-créés si manquants
heroImage non Nom de fichier dans images/ du dossier importé
author non Email pour matcher contre les users ; fallback à l'utilisateur qui import
publishedAt non Date ISO (YYYY-MM-DD)
excerpt non Extrait court
seoTitle non Titre SEO
seoDescription non Description SEO

Format WP XML (WXR)

Le format standard de l'export WordPress. Le plugin parse :

  • <wp:post_type> → distingue post / page / attachment
  • <wp:post_status> → publish → online, draft → draft
  • <wp:post_name> → slug
  • <wp:post_date> → publishedAt
  • <title>, <content:encoded>, <excerpt:encoded> → contenus
  • <category> / <wp:tag_name> → catégories et tags

Les attachments (images) sont uploadés via leur URL (le plugin fetch chaque URL puis upload sur Flexweg). Si une URL d'image WP est dans le body d'un post, le plugin la réécrit vers la nouvelle URL média Flexweg.

Cas particulier : import des blocs de thème

Si vos posts markdown utilisent des blocs de thème (corporate, magazine, marketplace-core), encodez-les en marqueurs base64 dans le body :

MARKDOWN
<div data-cms-block="corporate/hero-overlay" data-attrs="eyJ0aXRsZSI6Ikhpci..."></div>

## Description

Contenu markdown normal ici.

<div data-cms-block="corporate/services-grid" data-attrs="eyJlecQ...."></div>

Pour générer le base64 depuis Node : Buffer.from(JSON.stringify(attrs)).toString("base64").

L'importeur les passe tels quels ; le thème les rend à la publication.

Cas multilang : sidecars .fr.md

Si flexweg-multilang est activé, vous pouvez fournir une traduction FR pour chaque post via un sidecar <file>.fr.md à côté du source :

demo-content/
├── 01-first-post.md         (EN)
├── 01-first-post.fr.md      (FR)
└── ...

L'importeur reconnaît la convention et stocke la traduction dans Post.translations.fr automatiquement.

Cas multilang : _terms.json

Pour les traductions de catégories / tags, fournissez un _terms.json dans le dossier :

JSON
{
  "categories": {
    "Recipes": {
      "fr": {
        "name": "Recettes",
        "slug": "recettes",
        "description": "..."
      }
    }
  },
  "tags": { ... }
}

L'importeur applique ces traductions après création des termes.

Gotcha : terms stales pendant l'import in-loop

Si vous mettez le status mode à Always online, l'importeur auto-publie chaque post dans la boucle d'import. La publication peut tourner avec une snapshot stale de ctx.terms (captée avant la création des nouveaux termes), causant des posts publiés à la racine au lieu de <catégorie>/<slug>.html.

L'admin propose une action Repair URLs sous le menu Regenerate pour fixer ça après coup. Mais le défaut plus sûr est d'importer en draft puis bulk-publish après.

Désactivation

Pas possible — must-use. Mais comme il ne tourne que quand vous utilisez sa page de réglages, son coût en runtime est nul si vous ne l'utilisez pas.

Imports répétés

Vous pouvez re-importer le même dossier plusieurs fois. Le plugin vérifie l'existence par slug : si un post avec le même slug existe déjà :

  • En mode Drag and drop : le post est skippé (vous voyez dans le résumé)
  • En mode WP XML : pareil

Pour forcer un re-import (par exemple après modification d'un .md source), supprimez d'abord les posts cible.