EmDash für WordPress-Entwickler:innen

Auf dieser Seite

EmDash bringt vertraute WordPress-Konzepte—Beiträge, Seiten, Taxonomien, Menüs, Widgets und eine Medienbibliothek—in einen modernen Astro-Stack. Ihr Content-Management-Wissen lässt sich direkt übertragen.

Was vertraut bleibt

Die Konzepte aus WordPress sind in EmDash erstklassige Features:

  • Collections funktionieren wie Custom Post Types—Struktur definieren, in Templates abfragen
  • Taxonomien gleichermaßen—hierarchisch (wie Kategorien) und flach (wie Schlagwörter)
  • Menüs mit Drag-and-Drop-Reihenfolge und verschachtelten Einträgen
  • Widget Areas für Sidebars und dynamische Content-Bereiche
  • Medienbibliothek mit Upload, Organisation und Bildverwaltung
  • Admin UI, die Redakteur:innen ohne Code nutzen können

Was anders ist

Die Umsetzung ändert sich, das mentale Modell bleibt gleich:

TypeScript statt PHP

Templates sind Astro-Komponenten. Die Syntax ist klarer, das Konzept dasselbe: Server-Code, der HTML ausgibt.

Content APIs statt WP_Query

Abfragefunktionen wie getEmDashCollection() ersetzen WP_Query. Kein SQL, nur Funktionsaufrufe.

Dateibasiertes Routing

Dateien in src/pages/ werden URLs. Keine Rewrite-Regeln oder Template-Hierarchie zum Auswendiglernen.

Komponenten statt Template Parts

Komponenten importieren und nutzen. Gleiche Idee wie get_template_part(), bessere Organisation.

Kurzreferenz

WordPressEmDashHinweise
Custom Post TypesCollectionsÜber Admin-UI oder API definieren
WP_QuerygetEmDashCollection()Filter, Limits, Taxonomie-Abfragen
get_post()getEmDashEntry()Liefert Eintrag oder null
Categories/TagsTaxonomiesHierarchische Unterstützung bleibt
register_nav_menus()getMenu()Menüs als erstklassiges Feature
register_sidebar()getWidgetArea()Widget-Bereiche als erstklassiges Feature
bloginfo('name')getSiteSetting("title")Site-Settings-API
the_content()<PortableText />Rendering strukturierter Inhalte
ShortcodesPortable Text blocksEigene Komponenten
add_action/filter()Plugin hookscontent:beforeSave, usw.
wp_optionsctx.kvKey-Value-Speicher
Theme directorysrc/ directoryKomponenten, Layouts, Seiten
functions.phpastro.config.mjs + EmDash configBuild- und Laufzeitkonfiguration

Content APIs

Collections abfragen

WordPress nutzt WP_Query oder Hilfsfunktionen. EmDash nutzt typisierte Abfragefunktionen.

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>
))}

Einzelnen Eintrag holen

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>

Template-Hierarchie

WordPress nutzt eine Template-Hierarchie, um zu wählen, welche Datei eine Seite rendert. Astro nutzt explizites dateibasiertes Routing.

WordPress TemplateEmDash-Äquivalent
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 → Komponenten

WordPress-Template-Parts werden Astro-Komponenten:

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} />)}

Menüs

EmDash unterstützt Menüs als erstklassiges Feature mit automatischer URL-Auflösung:

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>

Menüs entstehen über die Admin-UI, Seed-Dateien oder WordPress-Import.

Widget-Bereiche

Widget-Bereiche funktionieren wie Sidebars in 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>
)}

Site-Einstellungen

Site-Optionen und Customizer-Einstellungen entsprechen 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 }

Taxonomien

Taxonomien sind konzeptionell gleich—hierarchisch (wie Kategorien) oder flach (wie Schlagwörter):

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 → Plugin-System

WordPress-Hooks (add_action, add_filter) werden zu EmDash-Plugin-Hooks:

WordPress HookEmDash HookZweck
save_postcontent:beforeSaveInhalt vor dem Speichern ändern
the_contentPortableText componentsGerenderten Inhalt transformieren
pre_get_postsQuery optionsAbfragen filtern
wp_headLayout <head>Head-Inhalt hinzufügen
wp_footerLayout before </body>Footer-Inhalt hinzufügen

Was in EmDash besser ist

Typsicherheit

TypeScript durchgängig. Collections, Abfragen und Komponenten sind voll typisiert. Kein Raten mehr bei Feldnamen oder Rückgabetypen.

Performance

Kein PHP-Overhead. Static Generation standardmäßig. Server-Rendering bei Bedarf. Bereit für Edge-Deployment.

Moderne DX

Hot Module Replacement. Komponentenarchitektur. Moderne Toolchain (Vite, TypeScript, ESLint).

Git-basierte Deployments

Code und Templates in Git. Content in der Datenbank. Kein FTP, keine Dateirechte, keine gehackten Sites.

EmDash erzeugt sichere Preview-URLs mit HMAC-signierten Tokens. Redakteur:innen können Entwürfe ohne Login in Production ansehen—Link teilen, keine Zugangsdaten.

Keine Plugin-Konflikte

WordPress-Plugin-Konflikte entfallen. EmDash-Plugins laufen in isolierten Kontexten mit expliziten APIs. Keine globale State-Verschmutzung.

Erlebnis für Content-Redakteur:innen

Redakteur:innen nutzen das EmDash-Admin-Panel, ähnlich wie wp-admin:

  • Dashboard mit letzter Aktivität
  • Collection-Listen mit Suche, Filter und Bulk-Aktionen
  • Rich Editor für Inhalte (Portable Text, nicht Gutenberg)
  • Medienbibliothek mit Drag-and-Drop-Upload
  • Menü-Builder mit Drag-and-Drop-Reihenfolge
  • Widget-Bereich-Editor für Sidebar-Inhalte

Das Bearbeiten fühlt sich vertraut an. Die Technik darunter ist modern.

Migrationspfad

EmDash importiert WordPress-Inhalte direkt:

  1. Export aus WordPress (Werkzeuge → Export)
  2. Die .xml-Datei im EmDash-Admin hochladen
  3. Post Types Collections zuordnen
  4. Inhalte und Medien importieren

Beiträge, Seiten, Taxonomien, Menüs und Medien werden übernommen. Gutenberg-Blöcke werden zu Portable Text. Custom Fields werden analysiert und gemappt.

Siehe den WordPress-Migrationsleitfaden für die vollständige Anleitung.

Nächste Schritte