WordPress 개발자를 위한 EmDash

이 페이지

EmDash는 익숙한 WordPress 개념인 포스트, 페이지, 분류체계, 메뉴, 위젯, 미디어 라이브러리를 현대적인 Astro 스택으로 가져옵니다. 콘텐츠 관리 지식이 직접 전환됩니다.

익숙하게 유지되는 것

WordPress에서 알고 있는 개념은 EmDash에서 일급 기능입니다:

  • Collections는 커스텀 포스트 타입처럼 작동합니다—콘텐츠 구조를 정의하고 템플릿에서 쿼리합니다
  • 분류체계는 동일하게 작동합니다—계층형(카테고리처럼)과 평면형(태그처럼)
  • 메뉴는 드래그 앤 드롭 정렬과 중첩된 항목 지원
  • 위젯 영역은 사이드바와 동적 콘텐츠 영역용
  • 미디어 라이브러리는 업로드, 구성, 이미지 관리 지원
  • 관리자 UI는 콘텐츠 편집자가 코드를 건드리지 않고 사용할 수 있습니다

다른 점

구현은 변경되지만 정신적 모델은 동일합니다:

PHP 대신 TypeScript

템플릿은 Astro 컴포넌트입니다. 구문은 더 깔끔하지만 개념은 동일합니다: HTML을 출력하는 서버 코드입니다.

WP_Query 대신 콘텐츠 API

getEmDashCollection()과 같은 쿼리 함수가 WP_Query를 대체합니다. SQL 없이 함수 호출만 있습니다.

파일 기반 라우팅

src/pages/의 파일이 URL이 됩니다. 재작성 규칙이나 템플릿 계층을 외울 필요가 없습니다.

템플릿 부분 대신 컴포넌트

컴포넌트를 가져와 사용합니다. get_template_part()와 같은 아이디어로 더 나은 구성입니다.

빠른 참조

WordPressEmDash참고사항
커스텀 포스트 타입Collections관리자 UI 또는 API를 통해 정의
WP_QuerygetEmDashCollection()필터, 제한, 분류체계 쿼리
get_post()getEmDashEntry()항목 또는 null 반환
카테고리/태그분류체계계층 지원 유지
register_nav_menus()getMenu()일급 메뉴 지원
register_sidebar()getWidgetArea()일급 위젯 영역
bloginfo('name')getSiteSetting("title")사이트 설정 API
the_content()<PortableText />구조화된 콘텐츠 렌더링
쇼트코드Portable Text 블록사용자 정의 컴포넌트
add_action/filter()플러그인 훅content:beforeSave
wp_optionsctx.kv키-값 저장소
테마 디렉터리src/ 디렉터리컴포넌트, 레이아웃, 페이지
functions.phpastro.config.mjs + EmDash 구성빌드 및 런타임 구성

콘텐츠 API

Collections 쿼리

WordPress 쿼리는 WP_Query 또는 헬퍼 함수를 사용합니다. EmDash는 타입이 지정된 쿼리 함수를 사용합니다.

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

단일 항목 가져오기

다음 예제는 식별자로 항목을 가져와 렌더링합니다. WordPress와 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>

템플릿 계층

WordPress는 템플릿 계층을 사용하여 어떤 파일이 페이지를 렌더링할지 선택합니다. Astro는 명시적인 파일 기반 라우팅을 사용합니다.

WordPress 템플릿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

템플릿 부분 → 컴포넌트

WordPress 템플릿 부분은 Astro 컴포넌트가 됩니다:

WordPress

// 템플릿에서:
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는 자동 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>

메뉴는 관리자 UI, 시드 파일 또는 WordPress 가져오기를 통해 생성됩니다.

위젯 영역

위젯 영역은 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} />;
      }
      // 다른 위젯 유형 처리
    })}
  </aside>
)}

사이트 설정

사이트 옵션 및 커스터마이저 설정은 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

다음 예제는 getSiteSetting()으로 개별 설정을 읽습니다:

import { getSiteSetting } from "emdash";

const title = await getSiteSetting("title");
const logo = await getSiteSetting("logo"); // { mediaId, alt, url } 반환

분류체계

분류체계는 개념적으로 동일하게 작동합니다—계층형(카테고리처럼) 또는 평면형(태그처럼):

import { getTaxonomyTerms, getEntryTerms, getTerm } from "emdash";

// 모든 카테고리 가져오기
const categories = await getTaxonomyTerms("categories");

// 특정 용어 가져오기
const news = await getTerm("categories", "news");

// 포스트의 용어 가져오기
const postCategories = await getEntryTerms("posts", postId, "categories");

훅 → 플러그인 시스템

WordPress 훅(add_action, add_filter)은 EmDash 플러그인 훅이 됩니다:

WordPress 훅EmDash 훅목적
save_postcontent:beforeSave저장하기 전에 콘텐츠 수정
the_contentPortableText 컴포넌트렌더링된 콘텐츠 변환
pre_get_posts쿼리 옵션쿼리 필터링
wp_head레이아웃 <head>head 콘텐츠 추가
wp_footer레이아웃 </body>footer 콘텐츠 추가

EmDash에서 더 나은 점

타입 안전성

전체적으로 TypeScript. Collections, 쿼리 및 컴포넌트가 완전히 타입 지정되어 있어 필드 이름과 반환 타입이 자동 완성되고 빌드 시 확인됩니다.

성능

기본적으로 정적 생성, 필요할 때 서버 렌더링. 엣지 배포 준비.

현대적인 DX

Hot Module Replacement. 컴포넌트 기반 아키텍처. 현대적인 도구(Vite, TypeScript, ESLint).

Git 기반 배포

코드와 템플릿은 git에 존재하고 콘텐츠는 데이터베이스에 존재합니다. 코드를 푸시하여 배포합니다.

미리보기 링크

EmDash는 HMAC 서명 토큰으로 안전한 미리보기 URL을 생성합니다. 콘텐츠 편집자는 미리보기 링크를 공유하여 초안을 보여줄 수 있으므로 검토자는 프로덕션 로그인 없이 볼 수 있습니다.

격리된 플러그인

EmDash 플러그인은 명시적 API가 있는 격리된 컨텍스트에서 실행됩니다. 각 플러그인은 선언한 API만 도달하므로 플러그인이 서로의 전역 상태를 공유하거나 덮어쓰지 않습니다.

콘텐츠 편집자 경험

콘텐츠 편집자는 wp-admin과 유사한 EmDash 관리자 패널을 사용합니다:

  • 최근 활동이 있는 대시보드
  • 검색, 필터 및 대량 작업이 있는 Collection 목록
  • 콘텐츠용 리치 에디터(Gutenberg가 아닌 Portable Text)
  • 드래그 앤 드롭 업로드가 있는 미디어 라이브러리
  • 드래그 앤 드롭 정렬이 있는 메뉴 빌더
  • 사이드바 콘텐츠용 위젯 영역 편집기

편집 경험은 익숙합니다. 기본 기술은 현대적입니다.

마이그레이션 경로

EmDash는 WordPress 콘텐츠를 직접 가져옵니다:

  1. WordPress에서 내보내기(도구 → 내보내기)
  2. EmDash의 관리자에서 .xml 파일 업로드
  3. 포스트 타입을 Collections에 매핑
  4. 콘텐츠 및 미디어 가져오기

포스트, 페이지, 분류체계, 메뉴 및 미디어가 전송됩니다. Gutenberg 블록은 Portable Text로 변환됩니다. 사용자 정의 필드는 분석되고 매핑됩니다.

전체 지침은 WordPress 마이그레이션 가이드를 참조하세요.

다음 단계