EmDash per sviluppatori WordPress

In questa pagina

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

WordPressEmDashNote
Custom Post TypesCollectionsDefinisci tramite UI admin o API
WP_QuerygetEmDashCollection()Filtri, limiti, query di tassonomia
get_post()getEmDashEntry()Restituisce entry o null
Categorie/TagTassonomieSupporto 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
ShortcodeBlocchi Portable TextComponenti personalizzati
add_action/filter()Hook plugincontent:beforeSave, ecc.
wp_optionsctx.kvStorage chiave-valore
Directory temaDirectory src/Componenti, layout, pagine
functions.phpastro.config.mjs + configurazione EmDashConfigurazione 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 WordPressEquivalente 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 → 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} />)}

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():

WordPressEmDash
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 WordPressHook EmDashScopo
save_postcontent:beforeSaveModificare il contenuto prima di salvare
the_contentComponenti PortableTextTrasformare il contenuto renderizzato
pre_get_postsOpzioni queryFiltrare le query
wp_headLayout <head>Aggiungere contenuto head
wp_footerLayout 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.

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:

  1. Esporta da WordPress (Strumenti → Esporta)
  2. Carica il file .xml nell’admin di EmDash
  3. Mappa i post types alle collections
  4. 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