EmDash per sviluppatori WordPress

In questa pagina

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

WordPressEmDashNote
Custom Post TypesCollectionsDefinizione tramite admin UI o API
WP_QuerygetEmDashCollection()Filtri, limiti, query sulle tassonomie
get_post()getEmDashEntry()Restituisce la voce o null
Categories/TagsTaxonomiesSupporto 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
ShortcodesPortable Text blocksComponenti personalizzati
add_action/filter()Plugin hookscontent:beforeSave, ecc.
wp_optionsctx.kvArchiviazione chiave-valore
Theme directorysrc/ directoryComponenti, layout, pagine
functions.phpastro.config.mjs + EmDash configConfigurazione 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 TemplateEquivalente 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 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} />)}

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

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 }

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 HookEmDash HookScopo
save_postcontent:beforeSaveModificare il contenuto prima del salvataggio
the_contentPortableText componentsTrasformare il contenuto renderizzato
pre_get_postsQuery optionsFiltrare le query
wp_headLayout <head>Aggiungere contenuto nell’head
wp_footerLayout 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.

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:

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