EmDash pour les développeurs WordPress

Sur cette page

EmDash apporte les concepts familiers de WordPress—articles, pages, taxonomies, menus, widgets et une bibliothèque multimédia—dans une stack Astro moderne. Vos connaissances en gestion de contenu se transfèrent directement.

Ce qui reste familier

Les concepts que vous connaissez de WordPress sont des fonctionnalités de première classe dans EmDash :

  • Collections fonctionnent comme les Custom Post Types—définissez votre structure de contenu, interrogez-la dans les templates
  • Taxonomies fonctionnent de la même manière—hiérarchiques (comme les catégories) et plates (comme les tags)
  • Menus avec tri glisser-déposer et éléments imbriqués
  • Zones de widgets pour les barres latérales et les régions de contenu dynamique
  • Bibliothèque multimédia avec téléchargement, organisation et gestion d’images
  • Interface d’administration que les éditeurs de contenu peuvent utiliser sans toucher au code

Ce qui est différent

L’implémentation change, mais le modèle mental reste le même :

TypeScript au lieu de PHP

Les templates sont des composants Astro. La syntaxe est plus propre, mais le concept est le même : code serveur qui génère du HTML.

APIs de contenu au lieu de WP_Query

Des fonctions de requête comme getEmDashCollection() remplacent WP_Query. Pas de SQL, juste des appels de fonction.

Routage basé sur les fichiers

Les fichiers dans src/pages/ deviennent des URLs. Pas de règles de réécriture ou de hiérarchie de templates à mémoriser.

Composants au lieu de template parts

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’UI d’admin ou l’API
WP_QuerygetEmDashCollection()Filtres, limites, requêtes de taxonomie
get_post()getEmDashEntry()Retourne l’entrée ou null
Catégories/TagsTaxonomiesSupport hiérarchique préservé
register_nav_menus()getMenu()Support de menu de première classe
register_sidebar()getWidgetArea()Zones de widgets de première classe
bloginfo('name')getSiteSetting("title")API de paramètres du site
the_content()<PortableText />Rendu de contenu structuré
ShortcodesBlocs Portable TextComposants personnalisés
add_action/filter()Hooks de plugincontent:beforeSave, etc.
wp_optionsctx.kvStockage clé-valeur
Répertoire de thèmeRépertoire src/Composants, layouts, pages
functions.phpastro.config.mjs + configuration EmDashConfiguration de build et runtime

APIs de contenu

Requêter les Collections

Les requêtes WordPress utilisent WP_Query ou des fonctions d’aide. 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>
))}

Obtenir une seule entrée

Les exemples suivants récupèrent une entrée par identifiant et la rendent, dans WordPress et dans EmDash :

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 de templates

WordPress utilise une hiérarchie de templates pour sélectionner quel fichier rend une page. Astro utilise un routage explicite basé sur les fichiers.

Template WordPressÉ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 template parts de WordPress deviennent des composants Astro :

WordPress

// Dans le 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>

La page suivante importe ce composant et le rend pour chaque article :

---
import PostCard from "../components/PostCard.astro";
import { getEmDashCollection } from "emdash";

const { entries: posts } = await getEmDashCollection("posts");
---

{posts.map((post) => <PostCard {post} />)}

EmDash a un support de menu de première classe avec résolution automatique d’URL :

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 sont créés via l’UI d’admin, 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} />;
      }
      // Gérer les autres types de widgets
    })}
  </aside>
)}

Paramètres du site

Les options du site et les paramètres du customizer se mappent à 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

L’exemple suivant lit les paramètres individuels avec getSiteSetting() :

import { getSiteSetting } from "emdash";

const title = await getSiteSetting("title");
const logo = await getSiteSetting("logo"); // Retourne { mediaId, alt, url }

Taxonomies

Les taxonomies fonctionnent de la même manière conceptuellement—hiérarchiques (comme les catégories) ou plates (comme les tags) :

import { getTaxonomyTerms, getEntryTerms, getTerm } from "emdash";

// Obtenir toutes les catégories
const categories = await getTaxonomyTerms("categories");

// Obtenir un terme spécifique
const news = await getTerm("categories", "news");

// Obtenir les termes pour un article
const postCategories = await getEntryTerms("posts", postId, "categories");

Hooks → Système de plugin

Les hooks WordPress (add_action, add_filter) deviennent des hooks de plugin EmDash :

Hook WordPressHook EmDashObjectif
save_postcontent:beforeSaveModifier le contenu avant sauvegarde
the_contentComposants PortableTextTransformer le contenu rendu
pre_get_postsOptions de requêteFiltrer les requêtes
wp_headLayout <head>Ajouter du contenu head
wp_footerLayout avant </body>Ajouter du contenu footer

Ce qui est mieux dans EmDash

Sécurité des types

TypeScript partout. Les collections, requêtes et composants sont entièrement typés, donc les noms de champs et les types de retour s’autocompletent et sont vérifiés au moment du build.

Performance

Génération statique par défaut, avec rendu serveur si nécessaire. Prêt pour le déploiement edge.

DX moderne

Hot Module Replacement. Architecture basée sur les composants. Outillage moderne (Vite, TypeScript, ESLint).

Déploiements basés sur Git

Le code et les templates vivent dans git ; le contenu vit dans la base de données. Déployez en poussant le code.

Liens de prévisualisation

EmDash génère des URLs de prévisualisation sécurisées avec des tokens signés HMAC. Les éditeurs de contenu partagent un lien de prévisualisation pour montrer un brouillon, afin que les relecteurs puissent le voir sans connexion de production.

Plugins isolés

Les plugins EmDash s’exécutent dans des contextes isolés avec des APIs explicites. Chaque plugin n’atteint que les APIs qu’il déclare, donc les plugins ne partagent pas ou n’écrasent pas l’état global de l’autre.

Expérience de l’éditeur de contenu

Les éditeurs de contenu utilisent le panneau d’administration EmDash, similaire à wp-admin :

  • Tableau de bord avec l’activité récente
  • Listes de collections avec recherche, filtres et actions en masse
  • Éditeur riche pour le contenu (Portable Text, pas Gutenberg)
  • Bibliothèque multimédia avec téléchargement glisser-déposer
  • Constructeur de menu avec tri glisser-déposer
  • Éditeur de zone de widgets pour le contenu de barre latérale

L’expérience d’édition est familière. La technologie sous-jacente est moderne.

Chemin de migration

EmDash importe le contenu WordPress directement :

  1. Exporter depuis WordPress (Outils → Exporter)
  2. Télécharger le fichier .xml dans l’admin d’EmDash
  3. Mapper les post types aux collections
  4. Importer le contenu et les médias

Les articles, pages, taxonomies, menus et médias sont transférés. Les blocs Gutenberg sont convertis en Portable Text. Les custom fields sont analysés et mappés.

Consultez le Guide de migration WordPress pour des instructions complètes.

Prochaines étapes