EmDash porta concetti familiari di WordPress—post, pagine, tassonomie, menu, widget e una libreria multimediale—in uno stack Astro moderno. La tua conoscenza della gestione dei contenuti si trasferisce direttamente.
Cosa rimane familiare
I concetti che conosci da WordPress sono funzionalità di prima classe in EmDash:
- Collections funzionano come i Custom Post Types—definisci la tua struttura di contenuto, interrogala nei template
- Tassonomie funzionano allo stesso modo—gerarchiche (come le categorie) e piatte (come i tag)
- Menu con ordinamento drag-and-drop ed elementi nidificati
- Aree widget per sidebar e regioni di contenuto dinamico
- Libreria multimediale con caricamento, organizzazione e gestione delle immagini
- UI amministrativa che gli editor di contenuti possono usare senza toccare il codice
Cosa è diverso
L’implementazione cambia, ma il modello mentale rimane lo stesso:
TypeScript invece di PHP
I template sono componenti Astro. La sintassi è più pulita, ma il concetto è lo stesso: codice server che genera HTML.
API di contenuto invece di WP_Query
Funzioni di query come getEmDashCollection() sostituiscono WP_Query. Niente SQL, solo chiamate di funzione.
Routing basato su file
I file in src/pages/ diventano URL. Niente regole di riscrittura o gerarchie di template da memorizzare.
Componenti invece di template parts
Importa e usa componenti. Stessa idea di get_template_part(), migliore organizzazione.
Riferimento rapido
| WordPress | EmDash | Note |
|---|---|---|
| Custom Post Types | Collections | Definisci tramite UI admin o API |
WP_Query | getEmDashCollection() | Filtri, limiti, query di tassonomia |
get_post() | getEmDashEntry() | Restituisce entry o null |
| Categorie/Tag | Tassonomie | Supporto gerarchico preservato |
register_nav_menus() | getMenu() | Supporto menu di prima classe |
register_sidebar() | getWidgetArea() | Aree widget di prima classe |
bloginfo('name') | getSiteSetting("title") | API impostazioni sito |
the_content() | <PortableText /> | Rendering contenuto strutturato |
| Shortcode | Blocchi Portable Text | Componenti personalizzati |
add_action/filter() | Hook plugin | content:beforeSave, ecc. |
wp_options | ctx.kv | Storage chiave-valore |
| Directory tema | Directory src/ | Componenti, layout, pagine |
functions.php | astro.config.mjs + configurazione EmDash | Configurazione build e runtime |
API di contenuto
Interrogare le Collections
Le query WordPress usano WP_Query o funzioni helper. EmDash usa funzioni di query tipizzate.
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>
))} Ottenere una singola entry
I seguenti esempi recuperano un’entry per identificativo e la renderizzano, in WordPress e 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> Gerarchia dei template
WordPress usa una gerarchia di template per selezionare quale file renderizza una pagina. Astro usa routing esplicito basato su file.
| Template WordPress | Equivalente 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 → Componenti
I template parts di WordPress diventano componenti Astro:
WordPress
// Nel 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 seguente pagina importa quel componente e lo renderizza per ogni post:
---
import PostCard from "../components/PostCard.astro";
import { getEmDashCollection } from "emdash";
const { entries: posts } = await getEmDashCollection("posts");
---
{posts.map((post) => <PostCard {post} />)} Menu
EmDash ha supporto menu di prima classe con risoluzione automatica degli 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> I menu vengono creati tramite l’UI admin, file seed o importazione WordPress.
Aree widget
Le aree widget funzionano come le sidebar 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} />;
}
// Gestisci altri tipi di widget
})}
</aside>
)} Impostazioni del sito
Le opzioni del sito e le impostazioni del customizer si mappano a 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 |
Il seguente esempio legge le impostazioni individuali con getSiteSetting():
import { getSiteSetting } from "emdash";
const title = await getSiteSetting("title");
const logo = await getSiteSetting("logo"); // Restituisce { mediaId, alt, url }
Tassonomie
Le tassonomie funzionano allo stesso modo concettualmente—gerarchiche (come le categorie) o piatte (come i tag):
import { getTaxonomyTerms, getEntryTerms, getTerm } from "emdash";
// Ottieni tutte le categorie
const categories = await getTaxonomyTerms("categories");
// Ottieni un termine specifico
const news = await getTerm("categories", "news");
// Ottieni i termini per un post
const postCategories = await getEntryTerms("posts", postId, "categories");
Hook → Sistema di plugin
Gli hook WordPress (add_action, add_filter) diventano hook plugin EmDash:
| Hook WordPress | Hook EmDash | Scopo |
|---|---|---|
save_post | content:beforeSave | Modificare il contenuto prima di salvare |
the_content | Componenti PortableText | Trasformare il contenuto renderizzato |
pre_get_posts | Opzioni query | Filtrare le query |
wp_head | Layout <head> | Aggiungere contenuto head |
wp_footer | Layout prima di </body> | Aggiungere contenuto footer |
Cosa è meglio in EmDash
Type Safety
TypeScript ovunque. Collections, query e componenti sono completamente tipizzati, quindi i nomi dei campi e i tipi di ritorno si autocompletano e vengono controllati al momento del build.
Performance
Generazione statica per impostazione predefinita, con rendering server quando necessario. Pronto per il deployment edge.
DX moderna
Hot Module Replacement. Architettura basata su componenti. Tooling moderno (Vite, TypeScript, ESLint).
Deployment basati su Git
Codice e template vivono in git; il contenuto vive nel database. Deploy pushando il codice.
Link di anteprima
EmDash genera URL di anteprima sicuri con token firmati HMAC. Gli editor di contenuti condividono un link di anteprima per mostrare una bozza, così i revisori possono vederla senza login di produzione.
Plugin isolati
I plugin EmDash vengono eseguiti in contesti isolati con API esplicite. Ogni plugin raggiunge solo le API che dichiara, quindi i plugin non condividono o sovrascrivono lo stato globale dell’altro.
Esperienza dell’editor di contenuti
Gli editor di contenuti usano il pannello admin di EmDash, simile a wp-admin:
- Dashboard con attività recente
- Elenchi di collections con ricerca, filtri e azioni in blocco
- Editor ricco per i contenuti (Portable Text, non Gutenberg)
- Libreria multimediale con caricamento drag-and-drop
- Menu builder con ordinamento drag-and-drop
- Editor area widget per contenuto sidebar
L’esperienza di editing è familiare. La tecnologia sottostante è moderna.
Percorso di migrazione
EmDash importa i contenuti WordPress direttamente:
- Esporta da WordPress (Strumenti → Esporta)
- Carica il file
.xmlnell’admin di EmDash - Mappa i post types alle collections
- Importa contenuti e media
Post, pagine, tassonomie, menu e media vengono trasferiti. I blocchi Gutenberg vengono convertiti in Portable Text. I custom field vengono analizzati e mappati.
Vedi la Guida alla migrazione WordPress per istruzioni complete.
Prossimi passi
- Iniziare — Configura il tuo primo sito EmDash
- Interrogare i contenuti — Approfondimento sulle API di contenuto
- Tassonomie — Categorie, tag e tassonomie personalizzate
- Menu — Menu di navigazione
- Migrare da WordPress — Importare contenuti esistenti