サイト設定は、サイトのグローバル構成値です:タイトル、タグライン、ロゴ、ソーシャルリンク、表示設定。管理者は管理インターフェースを通じてこれらを管理し、テンプレート内でアクセスできます。
設定のクエリ
getSiteSettings() を使用して、すべてのサイト設定を取得します:
---
import { getSiteSettings } from "emdash";
const settings = await getSiteSettings();
---
<html lang="en">
<head>
<title>{settings.title}</title>
{settings.favicon && (
<link rel="icon" href={settings.favicon.url} />
)}
</head>
<body>
<header>
{settings.logo ? (
<img src={settings.logo.url} alt={settings.logo.alt || settings.title} />
) : (
<span class="site-title">{settings.title}</span>
)}
{settings.tagline && <p class="tagline">{settings.tagline}</p>}
</header>
<slot />
</body>
</html>
利用可能な設定
EmDash は以下のコア設定を提供します:
interface SiteSettings {
// ID
title: string;
tagline?: string;
logo?: MediaReference;
favicon?: MediaReference;
// URL
url?: string;
// 表示
postsPerPage: number;
dateFormat: string;
timezone: string;
// ソーシャル
social?: {
twitter?: string;
github?: string;
facebook?: string;
instagram?: string;
linkedin?: string;
youtube?: string;
};
}
interface MediaReference {
mediaId: string;
alt?: string;
url?: string; // 解決済みURL(読み取り専用)
}
個別の設定を取得
getSiteSetting() を使用して、キーで単一の設定を取得します:
import { getSiteSetting } from "emdash";
const title = await getSiteSetting("title");
// 返り値: "My Site" または undefined
const logo = await getSiteSetting("logo");
// 返り値: { mediaId: "...", url: "/_emdash/api/media/file/..." }
これは、1つまたは2つの値のみが必要で、すべてを取得することを避けたい場合に便利です。
コンポーネントでの設定の使用
サイトヘッダー
次のコンポーネントは、サイトロゴとプライマリメニューを含むヘッダーをレンダリングします:
---
import { getSiteSettings, getMenu } from "emdash";
const settings = await getSiteSettings();
const menu = await getMenu("primary");
---
<header class="header">
<a href="/" class="logo">
{settings.logo ? (
<img
src={settings.logo.url}
alt={settings.logo.alt || settings.title}
width="150"
height="50"
/>
) : (
<span class="site-name">{settings.title}</span>
)}
</a>
{menu && (
<nav>
{menu.items.map(item => (
<a href={item.url}>{item.label}</a>
))}
</nav>
)}
</header>
ソーシャルリンク
次のコンポーネントは、構成された各ソーシャルプラットフォームのリンクをレンダリングします:
---
import { getSiteSetting } from "emdash";
const social = await getSiteSetting("social");
const platforms = [
{ key: "twitter", label: "Twitter", baseUrl: "https://twitter.com/" },
{ key: "github", label: "GitHub", baseUrl: "https://github.com/" },
{ key: "facebook", label: "Facebook", baseUrl: "https://facebook.com/" },
{ key: "instagram", label: "Instagram", baseUrl: "https://instagram.com/" },
{ key: "linkedin", label: "LinkedIn", baseUrl: "https://linkedin.com/in/" },
{ key: "youtube", label: "YouTube", baseUrl: "https://youtube.com/@" },
] as const;
---
{social && (
<div class="social-links">
{platforms.map(({ key, label, baseUrl }) => (
social[key] && (
<a
href={baseUrl + social[key]}
rel="noopener noreferrer"
target="_blank"
aria-label={label}
>
{label}
</a>
)
))}
</div>
)}
SEO メタタグ
次のコンポーネントは、サイト設定からドキュメントとOpen Graphのメタタグを構築します:
---
import { getSiteSettings } from "emdash";
interface Props {
title?: string;
description?: string;
image?: string;
}
const settings = await getSiteSettings();
const {
title,
description = settings.tagline,
image,
} = Astro.props;
const documentTitle = title
? `${title} | ${settings.title}`
: settings.title;
const ogTitle = title ?? settings.title;
---
<title>{documentTitle}</title>
{description && <meta name="description" content={description} />}
<!-- Open Graph -->
<meta property="og:title" content={ogTitle} />
{description && <meta property="og:description" content={description} />}
{image && <meta property="og:image" content={image} />}
{settings.url && <meta property="og:url" content={settings.url + Astro.url.pathname} />}
<!-- Twitter -->
{settings.social?.twitter && (
<meta name="twitter:site" content={settings.social.twitter} />
)}
<meta name="twitter:card" content={image ? "summary_large_image" : "summary"} />
日付の書式設定
一貫した日付表示のために、dateFormat と timezone 設定を使用します:
---
import { getSiteSetting } from "emdash";
interface Props {
date: string;
}
const { date } = Astro.props;
const dateFormat = await getSiteSetting("dateFormat") || "MMMM d, yyyy";
const timezone = await getSiteSetting("timezone") || "UTC";
// Intl.DateTimeFormat または date-fns のようなライブラリを使用してフォーマット
const formatted = new Intl.DateTimeFormat("en-US", {
timeZone: timezone,
dateStyle: "long",
}).format(new Date(date));
---
<time datetime={date}>{formatted}</time>
管理 API
GET リクエストでプログラム的に設定を取得します:
GET /_emdash/api/settings
レスポンスは設定の JSON オブジェクトです:
{
"title": "My EmDash Site",
"tagline": "A modern CMS",
"logo": {
"mediaId": "med_123",
"url": "/_emdash/api/media/file/abc123"
},
"postsPerPage": 10,
"dateFormat": "MMMM d, yyyy",
"timezone": "America/New_York",
"social": {
"twitter": "@handle",
"github": "username"
}
}
設定を更新(部分更新サポート):
POST /_emdash/api/settings
Content-Type: application/json
{
"title": "New Site Title",
"tagline": "Updated tagline"
}
提供されたフィールドのみが変更されます。省略されたフィールドは現在の値を保持します。
メディア参照
logo と favicon 設定はメディア参照を保存します。それらを読み取ると、EmDash は自動的に url プロパティを解決します:
const logo = await getSiteSetting("logo");
// {
// mediaId: "med_123",
// alt: "Site logo",
// url: "/_emdash/api/media/file/abc123"
// }
API 経由で更新する場合は、mediaId のみを提供します:
{
"logo": {
"mediaId": "med_456",
"alt": "New logo"
}
}
API リファレンス
getSiteSettings()
解決されたメディアURLを含むすべてのサイト設定を取得します。
戻り値: Promise<Partial<SiteSettings>>
部分オブジェクトを返します。設定されていない値は undefined です。
getSiteSetting(key)
キーで単一の設定を取得します。
パラメータ:
key— 設定キー(例:"title"、"logo"、"social")
戻り値: Promise<SiteSettings[K] | undefined>
型安全:戻り値の型はリクエストしたキーと一致します。