EmDash para desenvolvedores WordPress

Nesta página

O EmDash traz conceitos familiares do WordPress—posts, páginas, taxonomias, menus, widgets e uma biblioteca de mídia—para uma stack moderna com Astro. O seu conhecimento de gestão de conteúdos transfere-se diretamente.

O que continua familiar

Os conceitos que conhece no WordPress são funcionalidades de primeira classe no EmDash:

  • Collections funcionam como Custom Post Types—defina a estrutura do conteúdo e consulte-a nos templates
  • Taxonomies da mesma forma—hierárquicas (como categorias) e planas (como etiquetas)
  • Menus com ordenação por arrastar e largar e itens aninhados
  • Widget Areas para barras laterais e regiões de conteúdo dinâmico
  • Media library com carregamento, organização e gestão de imagens
  • Admin UI que editores podem usar sem mexer em código

O que muda

A implementação muda, mas o modelo mental mantém-se:

TypeScript em vez de PHP

Os templates são componentes Astro. A sintaxe é mais limpa, mas o conceito é o mesmo: código no servidor que produz HTML.

Content APIs em vez de WP_Query

Funções de consulta como getEmDashCollection() substituem WP_Query. Sem SQL, só chamadas a funções.

Encaminhamento baseado em ficheiros

Ficheiros em src/pages/ tornam-se URLs. Sem regras de reescrita nem hierarquia de templates a memorizar.

Componentes em vez de partes de template

Importe e use componentes. A mesma ideia que get_template_part(), com melhor organização.

Referência rápida

WordPressEmDashNotas
Custom Post TypesCollectionsDefinir via admin UI ou API
WP_QuerygetEmDashCollection()Filtros, limites, consultas por taxonomia
get_post()getEmDashEntry()Devolve entrada ou null
Categories/TagsTaxonomiesSuporte hierárquico mantido
register_nav_menus()getMenu()Menus de primeira classe
register_sidebar()getWidgetArea()Áreas de widgets de primeira classe
bloginfo('name')getSiteSetting("title")API de definições do site
the_content()<PortableText />Renderização de conteúdo estruturado
ShortcodesPortable Text blocksComponentes personalizados
add_action/filter()Plugin hookscontent:beforeSave, etc.
wp_optionsctx.kvArmazenamento chave-valor
Theme directorysrc/ directoryComponentes, layouts, páginas
functions.phpastro.config.mjs + EmDash configConfiguração de build e tempo de execução

Content APIs

Consultar collections

As consultas WordPress usam WP_Query ou funções auxiliares. O EmDash usa funções de consulta tipadas.

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>
))}

Obter uma única entrada

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>

Hierarquia de templates

O WordPress usa uma hierarquia de templates para escolher qual ficheiro renderiza uma página. O Astro usa encaminhamento explícito baseado em ficheiros.

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 parts → Componentes

As partes de template WordPress tornam-se componentes 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} />)}

O EmDash tem suporte de menu de primeira classe com resolução automática de 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>

Os menus criam-se na admin UI, ficheiros seed ou importação WordPress.

Áreas de widgets

As áreas de widgets funcionam como barras laterais no 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>
)}

Definições do site

As opções do site e do personalizador mapeiam para 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 }

Taxonomias

As taxonomias são conceptualmente iguais—hierárquicas (como categorias) ou planas (como etiquetas):

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");

Hooks → Sistema de plugins

Os hooks WordPress (add_action, add_filter) tornam-se hooks de plugins EmDash:

WordPress HookEmDash HookFinalidade
save_postcontent:beforeSaveAlterar conteúdo antes de guardar
the_contentPortableText componentsTransformar conteúdo renderizado
pre_get_postsQuery optionsFiltrar consultas
wp_headLayout <head>Adicionar conteúdo ao head
wp_footerLayout before </body>Adicionar conteúdo ao rodapé

O que melhora no EmDash

Segurança de tipos

TypeScript em todo o projeto. Collections, consultas e componentes totalmente tipados. Chega de adivinhar nomes de campos ou tipos de retorno.

Desempenho

Sem sobrecarga PHP. Geração estática por defeito. Renderização no servidor quando necessário. Pronto para deploy na edge.

DX moderna

Hot module replacement. Arquitetura baseada em componentes. Ferramentas atuais (Vite, TypeScript, ESLint).

Implementações baseadas em Git

Código e templates em git. Conteúdo na base de dados. Sem FTP, sem permissões de ficheiros, sem sites comprometidos.

Ligações de pré-visualização

O EmDash gera URLs de pré-visualização seguras com tokens assinados HMAC. Os editores podem pré-visualizar rascunhos sem iniciar sessão em produção—partilham uma ligação, não credenciais.

Sem conflitos entre plugins

Os conflitos típicos de plugins WordPress desaparecem. Os plugins EmDash executam em contextos isolados com APIs explícitas. Sem poluição de estado global.

Experiência do editor de conteúdo

Os editores usam o painel de administração EmDash, semelhante ao wp-admin:

  • Dashboard com atividade recente
  • Listagens de collections com pesquisa, filtros e ações em massa
  • Editor rico para conteúdo (Portable Text, não Gutenberg)
  • Biblioteca de mídia com carregamento por arrastar e largar
  • Construtor de menus com ordenação por arrastar e largar
  • Editor de áreas de widgets para conteúdo da barra lateral

A experiência de edição é familiar. A tecnologia por baixo é moderna.

Caminho de migração

O EmDash importa conteúdo WordPress diretamente:

  1. Exportar do WordPress (Ferramentas → Exportar)
  2. Carregar o ficheiro .xml no admin EmDash
  3. Mapear tipos de post para collections
  4. Importar conteúdo e mídia

Posts, páginas, taxonomias, menus e mídia transferem-se. Blocos Gutenberg convertem-se em Portable Text. Campos personalizados são analisados e mapeados.

Consulte o guia de migração WordPress para instruções completas.

Próximos passos