EmDash transpose des concepts WordPress familiers—articles, pages, taxonomies, menus, widgets et une médiathèque—dans une stack Astro moderne. Vos connaissances en gestion de contenu se transfèrent directement.
Ce qui reste familier
Les concepts que vous connaissez dans WordPress sont des fonctionnalités de première classe dans EmDash :
- Collections fonctionnent comme les Custom Post Types—définissez la structure du contenu, interrogez-la dans les modèles
- Taxonomies de la même manière—hiérarchiques (comme les catégories) et plates (comme les étiquettes)
- Menus avec ordre par glisser-déposer et éléments imbriqués
- Widget Areas pour les barres latérales et les zones de contenu dynamique
- Media library avec téléversement, organisation et gestion des images
- Admin UI utilisable par les éditeurs sans toucher au code
Ce qui change
L’implémentation change, mais le modèle mental reste le même :
TypeScript au lieu de PHP
Les modèles sont des composants Astro. La syntaxe est plus claire, mais le concept est identique : du code serveur qui produit du HTML.
Content APIs au lieu de WP_Query
Des fonctions de requête comme getEmDashCollection() remplacent WP_Query. Pas de SQL, seulement des appels de fonctions.
Routage basé sur les fichiers
Les fichiers dans src/pages/ deviennent des URL. Pas de règles de réécriture ni de hiérarchie de modèles à mémoriser.
Composants au lieu de parties de modèle
Importez et utilisez des composants. Même idée que get_template_part(), meilleure organisation.
Référence rapide
| WordPress | EmDash | Notes |
|---|---|---|
| Custom Post Types | Collections | Définir via l’admin UI ou l’API |
WP_Query | getEmDashCollection() | Filtres, limites, requêtes taxonomiques |
get_post() | getEmDashEntry() | Retourne une entrée ou null |
| Categories/Tags | Taxonomies | Support hiérarchique conservé |
register_nav_menus() | getMenu() | Menus de première classe |
register_sidebar() | getWidgetArea() | Zones de widgets de première classe |
bloginfo('name') | getSiteSetting("title") | API des réglages du site |
the_content() | <PortableText /> | Rendu de contenu structuré |
| Shortcodes | Portable Text blocks | Composants personnalisés |
add_action/filter() | Plugin hooks | content:beforeSave, etc. |
wp_options | ctx.kv | Stockage clé-valeur |
| Theme directory | src/ directory | Composants, layouts, pages |
functions.php | astro.config.mjs + EmDash config | Configuration de build et d’exécution |
Content APIs
Interroger les collections
Les requêtes WordPress utilisent WP_Query ou des fonctions utilitaires. EmDash utilise des fonctions de requête typées.
WordPress
<?php
$posts = new WP_Query([
'post_type' => 'post',
'posts_per_page' => 10,
'post_status' => 'publish',
'category_name' => 'news',
]);
while ($posts->have_posts()) :
$posts->the_post();
?>
<h2><?php the_title(); ?></h2>
<?php the_excerpt(); ?>
<?php endwhile; ?> EmDash
---
import { getEmDashCollection } from "emdash";
const { entries: posts } = await getEmDashCollection("posts", {
status: "published",
limit: 10,
where: { category: "news" },
});
---
{posts.map((post) => (
<article>
<h2>{post.data.title}</h2>
<p>{post.data.excerpt}</p>
</article>
))} Récupérer une entrée unique
WordPress
<?php
$post = get_post($id);
?>
<article>
<h1><?php echo $post->post_title; ?></h1>
<?php echo apply_filters('the_content', $post->post_content); ?>
</article> EmDash
---
import { getEmDashEntry } from "emdash";
import { PortableText } from "emdash/ui";
const { slug } = Astro.params;
const { entry: post } = await getEmDashEntry("posts", slug);
## if (!post) return Astro.redirect("/404");
<article>
<h1>{post.data.title}</h1>
<PortableText value={post.data.content} />
</article> Hiérarchie des modèles
WordPress utilise une hiérarchie de modèles pour choisir quel fichier rend une page. Astro utilise un routage explicite basé sur les fichiers.
| WordPress Template | Équivalent EmDash |
|---|---|
index.php | src/pages/index.astro |
single.php | src/pages/posts/[slug].astro |
single-{type}.php | src/pages/{type}/[slug].astro |
page.php | src/pages/pages/[slug].astro |
archive.php | src/pages/posts/index.astro |
archive-{type}.php | src/pages/{type}/index.astro |
category.php | src/pages/categories/[slug].astro |
tag.php | src/pages/tags/[slug].astro |
search.php | src/pages/search.astro |
404.php | src/pages/404.astro |
header.php / footer.php | src/layouts/Base.astro |
sidebar.php | src/components/Sidebar.astro |
Template parts → Composants
Les parties de modèle WordPress deviennent des composants Astro :
WordPress
// In template:
get_template_part('template-parts/content', 'post');
// template-parts/content-post.php:
<article class="post">
<h2><?php the_title(); ?></h2>
<?php the_excerpt(); ?>
</article> EmDash
---
const { post } = Astro.props;
---
<article class="post">
<h2>{post.data.title}</h2>
<p>{post.data.excerpt}</p>
</article>---
import PostCard from "../components/PostCard.astro";
import { getEmDashCollection } from "emdash";
const { entries: posts } = await getEmDashCollection("posts");
---
{posts.map((post) => <PostCard {post} />)} Menus
EmDash offre un support menu de première classe avec résolution d’URL automatique :
WordPress
<?php
wp_nav_menu([
'theme_location' => 'primary',
'container' => 'nav',
]);
?> EmDash
---
import { getMenu } from "emdash";
## const menu = await getMenu("primary");
<nav>
<ul>
{menu?.items.map((item) => (
<li>
<a href={item.url}>{item.label}</a>
</li>
))}
</ul>
</nav> Les menus se créent via l’admin UI, des fichiers seed ou l’import WordPress.
Zones de widgets
Les zones de widgets fonctionnent comme les barres latérales dans WordPress :
WordPress
<?php if (is_active_sidebar('sidebar-1')) : ?>
<aside>
<?php dynamic_sidebar('sidebar-1'); ?>
</aside>
<?php endif; ?> EmDash
---
import { getWidgetArea } from "emdash";
import { PortableText } from "emdash/ui";
## const sidebar = await getWidgetArea("sidebar");
{sidebar && (
<aside>
{sidebar.widgets.map((widget) => {
if (widget.type === "content") {
return <PortableText value={widget.content} />;
}
// Handle other widget types
})}
</aside>
)} Réglages du site
Les options du site et du personnalisateur correspondent à getSiteSetting() :
| WordPress | EmDash |
|---|---|
bloginfo('name') | getSiteSetting("title") |
bloginfo('description') | getSiteSetting("tagline") |
get_custom_logo() | getSiteSetting("logo") |
get_option('date_format') | getSiteSetting("dateFormat") |
home_url() | Astro.site |
import { getSiteSetting } from "emdash";
const title = await getSiteSetting("title");
const logo = await getSiteSetting("logo"); // Returns { mediaId, alt, url }
Taxonomies
Les taxonomies restent conceptuellement identiques—hiérarchiques (comme les catégories) ou plates (comme les étiquettes) :
import { getTaxonomyTerms, getEntryTerms, getTerm } from "emdash";
// Get all categories
const categories = await getTaxonomyTerms("categories");
// Get a specific term
const news = await getTerm("categories", "news");
// Get terms for a post
const postCategories = await getEntryTerms("posts", postId, "categories");
Hooks → Système de plugins
Les hooks WordPress (add_action, add_filter) deviennent des hooks de plugins EmDash :
| WordPress Hook | EmDash Hook | Objectif |
|---|---|---|
save_post | content:beforeSave | Modifier le contenu avant enregistrement |
the_content | PortableText components | Transformer le contenu rendu |
pre_get_posts | Query options | Filtrer les requêtes |
wp_head | Layout <head> | Ajouter du contenu dans le head |
wp_footer | Layout before </body> | Ajouter du contenu dans le footer |
Ce qui est meilleur dans EmDash
Sûreté des types
TypeScript partout. Collections, requêtes et composants entièrement typés. Fini de deviner les noms de champs ou les types de retour.
Performance
Pas de surcoût PHP. Génération statique par défaut. Rendu serveur si besoin. Prêt pour le déploiement en edge.
DX moderne
Hot module replacement. Architecture à composants. Outils modernes (Vite, TypeScript, ESLint).
Déploiements basés sur Git
Code et modèles dans git. Contenu en base. Pas de FTP, pas de permissions fichiers, pas de sites piratés.
Liens de prévisualisation
EmDash génère des URL de prévisualisation sécurisées avec des tokens signés HMAC. Les éditeurs peuvent prévisualiser des brouillons sans se connecter à la production—partager un lien, pas des identifiants.
Pas de conflits entre plugins
Les conflits de plugins WordPress disparaissent. Les plugins EmDash s’exécutent dans des contextes isolés avec des API explicites. Pas de pollution d’état global.
Expérience éditeur
Les éditeurs utilisent le panneau d’administration EmDash, proche de wp-admin :
- Dashboard avec activité récente
- Listes de collections avec recherche, filtres et actions groupées
- Éditeur riche pour le contenu (Portable Text, pas Gutenberg)
- Médiathèque avec téléversement par glisser-déposer
- Constructeur de menus avec ordre par glisser-déposer
- Éditeur de zones de widgets pour le contenu de barre latérale
L’expérience d’édition reste familière. La technologie en dessous est moderne.
Parcours de migration
EmDash importe directement le contenu WordPress :
- Exporter depuis WordPress (Outils → Exporter)
- Téléverser le fichier
.xmldans l’admin EmDash - Mapper les types de publication vers les collections
- Importer contenu et médias
Articles, pages, taxonomies, menus et médias sont transférés. Les blocs Gutenberg deviennent du Portable Text. Les champs personnalisés sont analysés et mappés.
Consultez le guide de migration WordPress pour les instructions complètes.
Étapes suivantes
- Getting Started — Configurez votre premier site EmDash
- Querying Content — Approfondir les Content APIs
- Taxonomies — Catégories, étiquettes et taxonomies personnalisées
- Menus — Menus de navigation
- Migrate from WordPress — Importer du contenu existant