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
.xmlexporté depuiswp-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
.xmlWXR.
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
statusdu 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
---
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 :
<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 :
{
"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.