EmDash bringt vertraute WordPress-Konzepte – Beiträge, Seiten, Taxonomien, Menüs, Widgets und eine Medienbibliothek – in einen modernen Astro-Stack. Ihr Content-Management-Wissen wird direkt übertragen.
Was vertraut bleibt
Die Konzepte, die Sie von WordPress kennen, sind erstklassige Funktionen in EmDash:
- Collections funktionieren wie Custom Post Types – definieren Sie Ihre Inhaltsstruktur, fragen Sie sie in Templates ab
- Taxonomien funktionieren genauso – hierarchisch (wie Kategorien) und flach (wie Tags)
- Menüs mit Drag-and-Drop-Sortierung und verschachtelten Elementen
- Widget-Bereiche für Sidebars und dynamische Inhaltsbereiche
- Medienbibliothek mit Upload, Organisation und Bildverwaltung
- Admin-UI, die Content-Editoren ohne Code-Berührung verwenden können
Was anders ist
Die Implementierung ändert sich, aber das mentale Modell bleibt gleich:
TypeScript statt PHP
Templates sind Astro-Komponenten. Die Syntax ist sauberer, aber das Konzept ist dasselbe: Server-Code, der HTML ausgibt.
Content-APIs statt WP_Query
Query-Funktionen wie getEmDashCollection() ersetzen WP_Query. Kein SQL, nur Funktionsaufrufe.
Dateibasiertes Routing
Dateien in src/pages/ werden zu URLs. Keine Rewrite-Regeln oder Template-Hierarchie zum Auswendiglernen.
Komponenten statt Template-Parts
Importieren und verwenden Sie Komponenten. Gleiche Idee wie get_template_part(), bessere Organisation.
Kurzreferenz
| WordPress | EmDash | Hinweise |
|---|---|---|
| Custom Post Types | Collections | Definieren über Admin-UI oder API |
WP_Query | getEmDashCollection() | Filter, Limits, Taxonomie-Abfragen |
get_post() | getEmDashEntry() | Gibt Eintrag oder null zurück |
| Kategorien/Tags | Taxonomien | Hierarchische Unterstützung erhalten |
register_nav_menus() | getMenu() | Erstklassige Menü-Unterstützung |
register_sidebar() | getWidgetArea() | Erstklassige Widget-Bereiche |
bloginfo('name') | getSiteSetting("title") | Site-Einstellungs-API |
the_content() | <PortableText /> | Strukturierte Content-Darstellung |
| Shortcodes | Portable Text Blöcke | Benutzerdefinierte Komponenten |
add_action/filter() | Plugin-Hooks | content:beforeSave, etc. |
wp_options | ctx.kv | Key-Value-Speicher |
| Theme-Verzeichnis | src/-Verzeichnis | Komponenten, Layouts, Seiten |
functions.php | astro.config.mjs + EmDash-Konfiguration | Build- und Laufzeit-Konfiguration |
Content-APIs
Collections abfragen
WordPress-Abfragen verwenden WP_Query oder Hilfsfunktionen. EmDash verwendet typisierte Query-Funktionen.
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 abrufen
Die folgenden Beispiele rufen einen Eintrag nach Kennung ab und rendern ihn, in WordPress und in 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> Template-Hierarchie
WordPress verwendet eine Template-Hierarchie, um auszuwählen, welche Datei eine Seite rendert. Astro verwendet explizites dateibasiertes Routing.
| WordPress-Template | EmDash-Äquivalent |
|---|---|
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 → Komponenten
WordPress-Template-Parts werden zu Astro-Komponenten:
WordPress
// Im 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>Die folgende Seite importiert diese Komponente und rendert sie für jeden Beitrag:
---
import PostCard from "../components/PostCard.astro";
import { getEmDashCollection } from "emdash";
const { entries: posts } = await getEmDashCollection("posts");
---
{posts.map((post) => <PostCard {post} />)} Menüs
EmDash hat erstklassige Menü-Unterstützung 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 werden über die Admin-UI, Seed-Dateien oder WordPress-Import erstellt.
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} />;
}
// Andere Widget-Typen behandeln
})}
</aside>
)} Site-Einstellungen
Site-Optionen und Customizer-Einstellungen werden auf getSiteSetting() abgebildet:
| 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 |
Das folgende Beispiel liest einzelne Einstellungen mit getSiteSetting():
import { getSiteSetting } from "emdash";
const title = await getSiteSetting("title");
const logo = await getSiteSetting("logo"); // Gibt { mediaId, alt, url } zurück
Taxonomien
Taxonomien funktionieren konzeptionell gleich – hierarchisch (wie Kategorien) oder flach (wie Tags):
import { getTaxonomyTerms, getEntryTerms, getTerm } from "emdash";
// Alle Kategorien abrufen
const categories = await getTaxonomyTerms("categories");
// Einen spezifischen Term abrufen
const news = await getTerm("categories", "news");
// Terms für einen Beitrag abrufen
const postCategories = await getEntryTerms("posts", postId, "categories");
Hooks → Plugin-System
WordPress-Hooks (add_action, add_filter) werden zu EmDash-Plugin-Hooks:
| WordPress-Hook | EmDash-Hook | Zweck |
|---|---|---|
save_post | content:beforeSave | Inhalt vor dem Speichern ändern |
the_content | PortableText-Komponenten | Gerenderten Inhalt transformieren |
pre_get_posts | Query-Optionen | Abfragen filtern |
wp_head | Layout <head> | Head-Inhalt hinzufügen |
wp_footer | Layout vor </body> | Footer-Inhalt hinzufügen |
Was in EmDash besser ist
Typsicherheit
TypeScript durchgehend. Collections, Queries und Komponenten sind vollständig typisiert, sodass Feldnamen und Rückgabetypen autovervollständigt werden und zur Build-Zeit überprüft werden.
Performance
Standardmäßig statische Generierung, mit Server-Rendering bei Bedarf. Edge-Deployment bereit.
Moderne DX
Hot Module Replacement. Komponentenbasierte Architektur. Moderne Tooling (Vite, TypeScript, ESLint).
Git-basierte Deployments
Code und Templates leben in Git; Inhalt lebt in der Datenbank. Deployment durch Code-Push.
Vorschau-Links
EmDash generiert sichere Vorschau-URLs mit HMAC-signierten Tokens. Content-Editoren teilen einen Vorschau-Link, um einen Entwurf zu zeigen, sodass Reviewer ihn ohne Produktions-Login sehen können.
Isolierte Plugins
EmDash-Plugins laufen in isolierten Kontexten mit expliziten APIs. Jedes Plugin erreicht nur die APIs, die es deklariert, sodass Plugins den globalen Status nicht teilen oder überschreiben.
Content-Editor-Erfahrung
Content-Editoren verwenden das EmDash-Admin-Panel, ähnlich wie wp-admin:
- Dashboard mit aktueller Aktivität
- Collection-Auflistungen mit Suche, Filter und Massenaktionen
- Rich-Editor für Inhalte (Portable Text, nicht Gutenberg)
- Medienbibliothek mit Drag-and-Drop-Upload
- Menü-Builder mit Drag-and-Drop-Sortierung
- Widget-Bereich-Editor für Sidebar-Inhalte
Die Bearbeitungserfahrung ist vertraut. Die zugrunde liegende Technologie ist modern.
Migrationspfad
EmDash importiert WordPress-Inhalte direkt:
- Export aus WordPress (Tools → Export)
- Hochladen der
.xml-Datei in EmDashs Admin - Zuordnung von Post Types zu Collections
- Import von Inhalten und Medien
Beiträge, Seiten, Taxonomien, Menüs und Medien werden übertragen. Gutenberg-Blöcke werden in Portable Text konvertiert. Custom Fields werden analysiert und zugeordnet.
Siehe den WordPress-Migrationsleitfaden für vollständige Anweisungen.
Nächste Schritte
- Erste Schritte — Richten Sie Ihre erste EmDash-Site ein
- Inhalte abfragen — Tiefer Einblick in Content-APIs
- Taxonomien — Kategorien, Tags und benutzerdefinierte Taxonomien
- Menüs — Navigationsmenüs
- Von WordPress migrieren — Vorhandene Inhalte importieren