サイト設定は、サイト全体に適用される値を保持します。テンプレートは、サイトの識別情報、ページネーション、日付処理、ソーシャルプロフィール、検索メタデータに使えます。
設定を構成する
EmDash 管理画面で Settings を開き、必要な値のページを選びます。
- General にはサイトタイトル、タグライン、ロゴ、ファビコン、公開 URL、ページあたりの投稿数、日付形式、タイムゾーンが含まれます。
- Social にはサポートされるソーシャルサービスのプロフィールハンドルが含まれます。
- SEO にはタイトル区切り、デフォルトのソーシャル画像、検証値、
robots.txtの内容が含まれます。
-
該当する設定ページを開きます。
-
サイトのテンプレートとメタデータが使う値を入力します。
-
ページを保存し、それらの設定を描画する公開ページを再読み込みします。
設定は構成されるまで任意です。テンプレートは必要な値ごとに適切なフォールバックを用意してください。
レイアウトで設定を読む
レイアウトが複数の値を必要とするときは getSiteSettings() を使います。構成済みのキーを部分オブジェクトとして返し、返す前にメディア参照を解決します。
次のベースレイアウトはサイト識別設定を使い、EmDashHead に構成済みのファビコン、デフォルトのソーシャル画像、サイト全体の検証メタデータを適用させます。
---
import { getSiteSettings } from "emdash";
import { createPublicPageContext } from "emdash/page";
import { EmDashHead } from "emdash/ui";
interface Props {
title?: string;
description?: string;
}
const { title, description } = Astro.props;
const settings = await getSiteSettings();
const siteTitle = settings.title ?? "My site";
const fullTitle = title ? `${title} — ${siteTitle}` : siteTitle;
const pageDescription = description ?? settings.tagline;
const page = createPublicPageContext({
Astro,
kind: "custom",
pageType: "website",
title: fullTitle,
pageTitle: title ?? siteTitle,
description: pageDescription,
siteName: siteTitle,
});
---
<!doctype html>
<html lang={Astro.currentLocale ?? "en"}>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>{fullTitle}</title>
<EmDashHead page={page} />
</head>
<body>
<header>
<a href="/" aria-label={siteTitle}>
{settings.logo?.url ? (
<img
src={settings.logo.url}
alt={settings.logo.alt ?? siteTitle}
width={settings.logo.width}
height={settings.logo.height}
/>
) : (
siteTitle
)}
</a>
{settings.tagline && <p>{settings.tagline}</p>}
</header>
<main>
<slot />
</main>
</body>
</html>
EmDashHead も getSiteSettings() を呼び出します。リクエストキャッシュにより、その呼び出しは別の設定クエリを実行するのではなく、レイアウトの結果を再利用します。
サーバーレンダリングのコンテンツページでは、コンテンツ参照を createPublicPageContext() に渡し、getEmDashEntry() でエントリーを取得します。EmDashHead はその後、エントリーの SEO パネル値をサイトのデフォルトの上に適用します。コンテンツページの完全なパターンは SEO パネルデータのレンダリング を参照してください。
1 つの設定を読む
コンポーネントが 1 つの値を必要とし、親がまだ設定オブジェクトを取得していないときは getSiteSetting() を使います。
次のコンポーネントは、構成済みのタイムゾーンでタイムスタンプを整形します。
---
import { getSiteSetting } from "emdash";
interface Props {
date: Date;
}
const { date } = Astro.props;
const timezone = await getSiteSetting("timezone") ?? "UTC";
const formatted = new Intl.DateTimeFormat(Astro.currentLocale, {
dateStyle: "long",
timeZone: timezone,
}).format(date);
---
<time datetime={date.toISOString()}>{formatted}</time>
dateFormat 設定は MMMM d, yyyy のようなパターン文字列です。Intl.DateTimeFormat はその構文を消費しません。テンプレートが正確に適用する必要があるときは、パターン文字列をサポートするフォーマットライブラリを使ってください。
ソーシャルプロフィールをレンダリングする
ソーシャル設定は完全なリンクではなく、ハンドルやユーザー名を保存します。テンプレートがどのプロフィールを表示するかを決め、構成済みの各値をサービスの URL に変換します。
次のコンポーネントは、構成済みの X と GitHub のプロフィールをレンダリングします。
---
import { getSiteSetting } from "emdash";
const social = await getSiteSetting("social");
const xHandle = social?.twitter?.replace(/^@/, "");
---
{(xHandle || social?.github) && (
<nav aria-label="Social profiles">
<ul>
{xHandle && (
<li>
<a href={`https://x.com/${xHandle}`} rel="me noopener" target="_blank">
X
</a>
</li>
)}
{social?.github && (
<li>
<a
href={`https://github.com/${social.github}`}
rel="me noopener"
target="_blank"
>
GitHub
</a>
</li>
)}
</ul>
</nav>
)}
構成済みの Facebook、Instagram、LinkedIn、YouTube の値にも同じパターンを適用します。これらのフィールドは管理画面で入力されたページ、プロフィール、チャンネル、ハンドルの値を保存し、公開 URL の形式はテーマ側の責任です。
メディア設定を使う
ロゴ、ファビコン、デフォルトのソーシャル画像はメディア参照として保存されます。読み取り時、EmDash は現在の URL と既知のコンテンツタイプ、幅、高さを追加します。参照されたメディア項目が削除されている場合、これらの解決済み値は欠けることがあるため、画像をレンダリングする前に url を確認してください。
管理画面では Remove ボタンでこれらの画像のいずれかを削除します。API と MCP クライアントは、そのフィールドを null に設定して logo、favicon、seo.defaultOgImage を削除できます。フィールドを省略すると現在の値は変わりません。
サイト設定はロゴとファビコンを 1 つずつ保持します。ダーク画像バリアントは EmDash の画像フィールドに属し、編集者が対応画像を選べ、Image コンポーネントが切り替えることができます。そのパターンは ダークモード を参照してください。
ランタイム API リファレンス は設定キーとクエリの戻り型を文書化しています。プログラムからの変更では、Bearer トークンで認証し、状態を変えるすべてのリクエストに X-EmDash-Request: 1 を追加してください。リクエスト本文とレスポンスは settings エンドポイント を参照してください。