EmDash pour les développeurs WordPress

Sur cette page

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

WordPressEmDashNotes
Custom Post TypesCollectionsDéfinir via l’admin UI ou l’API
WP_QuerygetEmDashCollection()Filtres, limites, requêtes taxonomiques
get_post()getEmDashEntry()Retourne une entrée ou null
Categories/TagsTaxonomiesSupport 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é
ShortcodesPortable Text blocksComposants personnalisés
add_action/filter()Plugin hookscontent:beforeSave, etc.
wp_optionsctx.kvStockage clé-valeur
Theme directorysrc/ directoryComposants, layouts, pages
functions.phpastro.config.mjs + EmDash configConfiguration 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.phpsrc/pages/index.astro
single.phpsrc/pages/posts/[slug].astro
single-{type}.phpsrc/pages/{type}/[slug].astro
page.phpsrc/pages/pages/[slug].astro
archive.phpsrc/pages/posts/index.astro
archive-{type}.phpsrc/pages/{type}/index.astro
category.phpsrc/pages/categories/[slug].astro
tag.phpsrc/pages/tags/[slug].astro
search.phpsrc/pages/search.astro
404.phpsrc/pages/404.astro
header.php / footer.phpsrc/layouts/Base.astro
sidebar.phpsrc/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} />)}

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() :

WordPressEmDash
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 HookEmDash HookObjectif
save_postcontent:beforeSaveModifier le contenu avant enregistrement
the_contentPortableText componentsTransformer le contenu rendu
pre_get_postsQuery optionsFiltrer les requêtes
wp_headLayout <head>Ajouter du contenu dans le head
wp_footerLayout 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 :

  1. Exporter depuis WordPress (Outils → Exporter)
  2. Téléverser le fichier .xml dans l’admin EmDash
  3. Mapper les types de publication vers les collections
  4. 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