EmDash porta concetti WordPress familiari—articoli, pagine, tassonomie, menu, widget e una libreria media—in uno stack Astro moderno. Le tue competenze di content management si trasferiscono direttamente.
Cosa resta familiare
I concetti che conosci in WordPress sono funzionalità di prima classe in EmDash:
- Collections funzionano come i Custom Post Types—definisci la struttura dei contenuti e interrogarla nei template
- Taxonomies allo stesso modo—gerarchiche (come le categorie) e piatte (come i tag)
- Menus con ordinamento drag-and-drop ed elementi annidati
- Widget Areas per sidebar e regioni di contenuto dinamico
- Media library con caricamento, organizzazione e gestione delle immagini
- Admin UI usabile dai redattori senza toccare il codice
Cosa cambia
L’implementazione cambia, ma il modello mentale resta lo stesso:
TypeScript al posto di PHP
I template sono componenti Astro. La sintassi è più pulita, ma il concetto è lo stesso: codice lato server che produce HTML.
Content API al posto di WP_Query
Funzioni di query come getEmDashCollection() sostituiscono WP_Query. Niente SQL, solo chiamate a funzione.
Routing basato su file
I file in src/pages/ diventano URL. Niente regole di rewrite o gerarchia di template da memorizzare.
Componenti al posto delle template part
Importa e usa componenti. Stessa idea di get_template_part(), organizzazione migliore.
Riferimento rapido
| WordPress | EmDash | Note |
|---|---|---|
| Custom Post Types | Collections | Definizione tramite admin UI o API |
WP_Query | getEmDashCollection() | Filtri, limiti, query sulle tassonomie |
get_post() | getEmDashEntry() | Restituisce la voce o null |
| Categories/Tags | Taxonomies | Supporto gerarchico invariato |
register_nav_menus() | getMenu() | Menu di prima classe |
register_sidebar() | getWidgetArea() | Aree widget di prima classe |
bloginfo('name') | getSiteSetting("title") | API delle impostazioni del sito |
the_content() | <PortableText /> | Rendering di contenuto strutturato |
| Shortcodes | Portable Text blocks | Componenti personalizzati |
add_action/filter() | Plugin hooks | content:beforeSave, ecc. |
wp_options | ctx.kv | Archiviazione chiave-valore |
| Theme directory | src/ directory | Componenti, layout, pagine |
functions.php | astro.config.mjs + EmDash config | Configurazione di build e runtime |
Content API
Interrogare le collections
Le query WordPress usano WP_Query o funzioni di supporto. 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 voce
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 scegliere quale file renderizza una pagina. Astro usa routing esplicito basato su file.
| WordPress Template | 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 part → Componenti
Le template part di WordPress diventano componenti 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} />)} Menu
EmDash offre 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 si creano dall’admin UI, da file seed o da import 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} />;
}
// Handle other widget types
})}
</aside>
)} Impostazioni del sito
Le opzioni del sito e del customizer si mappano su 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 |
import { getSiteSetting } from "emdash";
const title = await getSiteSetting("title");
const logo = await getSiteSetting("logo"); // Returns { mediaId, alt, url }
Tassonomie
Le tassonomie sono concettualmente le stesse—gerarchiche (come le categorie) o piatte (come i tag):
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");
Hook → Sistema plugin
Gli hook WordPress (add_action, add_filter) diventano hook plugin EmDash:
| WordPress Hook | EmDash Hook | Scopo |
|---|---|---|
save_post | content:beforeSave | Modificare il contenuto prima del salvataggio |
the_content | PortableText components | Trasformare il contenuto renderizzato |
pre_get_posts | Query options | Filtrare le query |
wp_head | Layout <head> | Aggiungere contenuto nell’head |
wp_footer | Layout before </body> | Aggiungere contenuto nel footer |
Cosa è migliore in EmDash
Type safety
TypeScript ovunque. Collections, query e componenti completamente tipizzati. Niente più tentativi sui nomi dei campi o sui tipi di ritorno.
Prestazioni
Nessun overhead PHP. Generazione statica di default. Rendering lato server quando serve. Pronto per il deploy su edge.
DX moderna
Hot module replacement. Architettura a componenti. Tooling moderno (Vite, TypeScript, ESLint).
Deploy basati su Git
Codice e template in git. Contenuto nel database. Niente FTP, niente permessi file, niente siti compromessi.
Link di anteprima
EmDash genera URL di anteprima sicuri con token firmati HMAC. I redattori possono anteprima bozze senza accedere alla produzione—condividono un link, non le credenziali.
Nessun conflitto tra plugin
I conflitti tra plugin WordPress spariscono. I plugin EmDash girano in contesti isolati con API esplicite. Nessuna inquinamento dello stato globale.
Esperienza del redattore
I redattori usano il pannello admin EmDash, simile a wp-admin:
- Dashboard con attività recente
- Elenchi delle collections con ricerca, filtri e azioni di massa
- Editor ricco per i contenuti (Portable Text, non Gutenberg)
- Libreria media con upload drag-and-drop
- Costruttore menu con ordinamento drag-and-drop
- Editor aree widget per il contenuto della sidebar
L’esperienza di modifica è familiare. La tecnologia sotto è moderna.
Percorso di migrazione
EmDash importa direttamente i contenuti WordPress:
- Esporta da WordPress (Strumenti → Esporta)
- Carica il file
.xmlnell’admin EmDash - Mappa i post type alle collections
- Importa contenuti e media
Articoli, pagine, tassonomie, menu e media vengono trasferiti. I blocchi Gutenberg diventano Portable Text. I campi personalizzati vengono analizzati e mappati.
Vedi la guida alla migrazione da WordPress per le istruzioni complete.
Passi successivi
- Getting Started — Configura il tuo primo sito EmDash
- Querying Content — Approfondisci le Content API
- Taxonomies — Categorie, tag e tassonomie personalizzate
- Menus — Menu di navigazione
- Migrate from WordPress — Importa contenuti esistenti