このサイトは非公式の日本語訳です。Cloudflare・EmDashプロジェクトが運営するサイトではありません。

このページで分かること

  • 16種類のフィールドの型と、それぞれが保存されるSQLiteの列の型
  • 型ごとの検証の設定とウィジェットの設定(文字列、数値、日時、選択肢、Portable Text、画像・ファイル、参照、JSON、リピーター)
  • すべてのフィールドに共通する設定、使えない予約済みのスラッグ、TypeScriptの型
難易度
上級
読む時間
7分
このページの目次

EmDashは、コンテンツのスキーマを定義するために16種類のフィールドの型をサポートしています。それぞれの型はSQLiteの列の型に対応し、型に合った管理画面のUIを提供します。

概要

次の表は、すべてのフィールドの型と、そのSQLiteの列の型の一覧です。

SQLiteの列 説明
string TEXT 短いテキストの入力
text TEXT 複数行のテキスト
url TEXT URLの値
number REAL 小数
integer INTEGER 整数
boolean INTEGER 真偽値(true/false)
datetime TEXT 日付と時刻
select TEXT 選択肢から1つを選ぶ
multiSelect JSON 選択肢から複数を選ぶ
portableText JSON リッチテキストのコンテンツ
image TEXT 画像への参照
file TEXT ファイルへの参照
reference TEXT 別のエントリーへの参照
json JSON 任意のJSONデータ
slug TEXT URLに使える識別子
repeater JSON フィールドのグループの繰り返し
本サイトの補足 やさしい解説:やさしい解説

WordPressでは、投稿にカスタムフィールド(投稿メタ)を追加して情報を持たせます。EmDashでは、コレクションにフィールドを追加し、そのときにこの表の「型」を選びます。型によって、保存されるデータベースの列の形と、管理画面に表示される入力欄が決まります。たとえば、string は1行の入力欄、text は複数行の入力欄、boolean はオンとオフの切り替えになります。

テキストの型

string

短い1行のテキストです。タイトル、名前、短い値に使います。

{
  slug: "title",
  label: "Title",
  type: "string",
  required: true,
  validation: {
    minLength: 1,
    maxLength: 200,
  },
}

検証のオプション:

  • minLength:最小の文字数
  • maxLength:最大の文字数
  • pattern:値が一致する必要がある正規表現

エディターは入力を maxLength までに制限し、長さのルールに対する文字数をリアルタイムで表示します。

ウィジェットのオプション:

  • この型に固有のものはありません

text

複数行のプレーンテキストです。説明、抜粋、長めのプレーンテキストに使います。

{
  slug: "excerpt",
  label: "Excerpt",
  type: "text",
  options: {
    rows: 3,
  },
}

検証のオプション:

  • minLength:最小の文字数
  • maxLength:最大の文字数
  • pattern:値が一致する必要がある正規表現

エディターは入力を maxLength までに制限し、長さのルールに対する文字数をリアルタイムで表示します。

ウィジェットのオプション:

  • rows:テキストエリアの行数(既定値:3)

url

Webのアドレスです。コンテンツAPIは、有効なURLでない値を拒否します。

{
  slug: "website",
  label: "Website",
  type: "url",
  required: true,
}

URLのフィールドはテキストとして保存されます。/about のような相対パスは url フィールドの有効な値ではないため、値が相対パスになる可能性がある場合は、代わりに string フィールドを使います。

slug

スラッグのような値を入れるためのテキストです。この独自のフィールドの型は、値を生成したり無害化したりしません。

{
  slug: "legacy_slug",
  label: "Legacy Slug",
  type: "slug",
  required: true,
  unique: true,
}

すべてのコンテンツのエントリーは、予約済みのシステムの slug をすでに持っており、EmDashはこれを公開URLのために別に管理しています。独自の slug フィールドは、コンテンツモデルがスラッグのような値をもう1つ保存する必要がある場合にだけ使います。

数値の型

number

小数です。価格、評価、測定値に使います。

{
  slug: "price",
  label: "Price",
  type: "number",
  required: true,
  validation: {
    min: 0,
    max: 999999.99,
  },
}

検証のオプション:

  • min:最小値
  • max:最大値

エディターは数値の入力欄に minmax を設定し、その下に許される範囲を表示します。

SQLiteのREAL(64ビットの浮動小数点数)として保存されます。

integer

整数です。数量、件数、並び順の値に使います。

{
  slug: "quantity",
  label: "Quantity",
  type: "integer",
  defaultValue: 1,
  validation: {
    min: 0,
    max: 1000,
  },
}

検証のオプション:

  • min:最小値
  • max:最大値

エディターは数値の入力欄に minmax を設定し、その下に許される範囲を表示します。

SQLiteのINTEGERとして保存されます。

boolean

真または偽です。切り替えやフラグに使います。

{
  slug: "featured",
  label: "Featured",
  type: "boolean",
  defaultValue: false,
}

SQLiteのINTEGER(0または1)として保存されます。

日付と時刻

datetime

ある時点を表します。API、MCP、CLIから書き込む場合は、Z または明示的なUTCからの時差を含める必要があります。管理画面の日時の選択欄は、「設定」→「一般」で設定したタイムゾーンで解釈されます。

{
  slug: "publishedAt",
  label: "Published At",
  type: "datetime",
}

保存形式: 2025-01-24T12:00:00.000Z

EmDashは、受け付けた入力を、ミリ秒を3桁にしたUTCに変換してから保存します。たとえば、2025-01-24T21:00:00+09:002025-01-24T12:00:00.000Z として保存されます。値が時点ではなく、カレンダー上の日付やその土地の時刻の場合は、代わりに string フィールドを使います。

選択の型

select

あらかじめ決めた選択肢から1つを選びます。

{
  slug: "status",
  label: "Status",
  type: "select",
  required: true,
  defaultValue: "draft",
  validation: {
    options: ["draft", "published", "archived"],
  },
}

検証のオプション:

  • options:許される値の配列(任意)。指定すると、あらかじめ決めた選択肢を表示し、それ以外の文字列を拒否します。指定しない場合、検証はどの文字列も受け付けます。

選択した値を含むTEXTとして保存されます。

multiSelect

あらかじめ決めた選択肢から複数を選びます。

{
  slug: "tags",
  label: "Tags",
  type: "multiSelect",
  validation: {
    options: ["news", "tutorial", "review", "opinion"],
  },
}

検証のオプション:

  • options:許される値の配列(任意)。指定すると、あらかじめ決めた選択肢を表示し、それ以外の文字列を拒否します。指定しない場合、検証はどの文字列の配列も受け付けます。

JSONの配列として保存されます:["news", "tutorial"]

リッチコンテンツ

portableText

Portable Textの形式を使うリッチテキストのコンテンツです。見出し、リスト、リンク、画像、独自のブロックをサポートします。

{
  slug: "content",
  label: "Content",
  type: "portableText",
  required: true,
}

値は、Portable TextのブロックのJSON配列として保存されます。例:

[
	{
		"_type": "block",
		"style": "normal",
		"children": [{ "_type": "span", "text": "Hello world" }]
	}
]

プラグインは、エディターに独自のブロックの種類(埋め込み、ウィジェットなど)を追加できます。これらはスラッシュコマンドのメニューに表示されます。保存したブロックを公開サイトで描画するには、ネイティブ型プラグインまたは付属のパッケージが提供するAstroのコンポーネントが必要です。Portable Textの描画コンポーネントを参照してください。

メディアの型

image

アップロードした画像への参照です。サイズや代替テキストなどのメタデータを含みます。

{
  slug: "featuredImage",
  label: "Featured Image",
  type: "image",
  validation: {
    allowedMimeTypes: ["image/jpeg", "image/png"],
  },
  options: {
    darkVariant: true,
  },
}

ウィジェットのオプション:

  • darkVariant:ダークカラースキームで表示する画像のための2つ目の枠を、編集者に提供します(既定値:false)。ダークモードを参照してください。

検証のオプション:

  • allowedMimeTypes:選択するメディアとして受け付ける、正確なMIMEタイプの一覧(空にはできません)

値は、メディアへの参照とそのメタデータを持つオブジェクトとして保存されます。

{
	"id": "01HXK5MZSN...",
	"src": "/_emdash/api/media/file/01HXK5MZSN...",
	"alt": "Description",
	"width": 1920,
	"height": 1080,
	"provider": "local",
	"meta": {
		"storageKey": "01HXK5MZSN....jpg"
	}
}

darkVariant を有効にすると、値の darkVariant に、同じ形でダークモード用の画像を持てます。

{
	"id": "01HXK5MZSN...",
	"alt": "Architecture diagram",
	"width": 1920,
	"height": 1080,
	"darkVariant": {
		"id": "01HXK5N2QT...",
		"width": 1920,
		"height": 1080
	}
}

file

ドキュメントやPDFなど、アップロードしたファイルへの参照です。

{
  slug: "document",
  label: "Document",
  type: "file",
  validation: {
    allowedMimeTypes: ["application/pdf"],
  },
}

検証のオプション:

  • allowedMimeTypes:選択するメディアとして受け付ける、正確なMIMEタイプの一覧(空にはできません)

値は、キャッシュしたメタデータを持つプロバイダーへの参照として保存されます。

{
	"id": "01HXK5MZSN...",
	"provider": "local",
	"filename": "report.pdf",
	"mimeType": "application/pdf",
	"meta": {
		"storageKey": "01HXK5MZSN....pdf"
	}
}

urlsize は、ほかのキャッシュしたメタデータのフィールドと同じく任意です。コンテンツのクエリは、保存された値をそのまま返し、メディアライブラリから情報を補いません。最新のメタデータやプロバイダー固有のURLが必要な場合の正式な取得APIについては、ファイルの値と現在のメタデータを参照してください。

関連の型

reference

別のコンテンツのエントリーへの参照です。

{
  slug: "author",
  label: "Author",
  type: "reference",
  required: true,
  options: {
    collection: "authors",
  },
}

ウィジェットのオプション:

  • collection:参照先のコレクションのスラッグ(必須)

参照は、参照先のエントリーのIDとして保存されます。

"01HXK5MZSN..."

柔軟な型

json

任意のJSONデータです。複雑な入れ子の構造、外部サービスとの連携、決まったスキーマのないデータに使います。

{
  slug: "metadata",
  label: "Metadata",
  type: "json",
}

SQLiteのJSONの列にそのまま保存されます。

repeater

構造化された行を繰り返すリストです。validation.subFields にサブフィールドを1つ以上定義します。すると、編集者はJSONをそのまま入力しなくても、行の追加、削除、並べ替え、編集ができます。

次のフィールドは、製品の仕様の一覧を保存します。

{
  slug: "specifications",
  label: "Specifications",
  type: "repeater",
  validation: {
    minItems: 1,
    maxItems: 12,
    subFields: [
      { slug: "label", label: "Label", type: "string", required: true },
      { slug: "value", label: "Value", type: "text", required: true },
      { slug: "source", label: "Source", type: "url" },
    ],
  },
}

リピーターの値は、オブジェクトの配列として保存されます。

[
	{
		"label": "Weight",
		"value": "1.2 kg",
		"source": "https://example.com/specifications"
	}
]

使えるサブフィールドの型は、stringtexturlnumberintegerbooleandatetimeselectimage です。リピーターの中に、別のリピーターや、portableTextreferencefile のような複雑なフィールドは入れられません。

リピーターの検証は、次のプロパティを受け付けます。

  • subFields:1つ以上のサブフィールドの定義。それぞれの定義には sluglabeltype が必要で、required も設定できます。select のサブフィールドは、options で選択肢を指定します。
  • minItems:最小の行数。0以上である必要があります。
  • maxItems:最大の行数。1以上で、minItems より小さくできません。

フィールドのプロパティ

すべてのフィールドは、次の共通のプロパティをサポートします。

プロパティ 説明
slug string 一意の識別子(必須)
label string 表示名(必須)
type FieldType フィールドの型(必須)
required boolean 値を必須にします(既定値:false)
unique boolean 値の重複を禁止します(既定値:false)
searchable boolean フィールドを全文検索の対象にします(既定値:false)
indexed boolean インデックスを使ったフィールドでの並べ替えと絞り込みを有効にします
translatable boolean ロケールごとに値を保存します(既定値:true)
defaultValue unknown 新しいエントリーの既定値
validation object 型ごとの検証のルール
widget string 独自のウィジェットへの置き換え
options object ウィジェットの設定
sortOrder number 管理画面での表示順

indexed は、スカラーのフィールド(stringurlnumberintegerbooleandatetimeselectreferenceslug)で使えます。インデックスを付けたフィールドは、コンテンツの一覧のクエリで orderBy のフィールドとして渡したり、fieldFilters で使ったりできます。インデックスを追加するたびに保存容量と書き込みの負荷が増えるため、並べ替えや絞り込みに使わないフィールドにはインデックスを付けないようにします。

searchable は、フィールドのテキストを、コレクションの全文検索のインデックスに追加します。識別子、価格、フラグなど、エントリーのすべての翻訳で同じにする必要がある値には、translatable: false を設定します。あるロケールで翻訳対象でないフィールドを変更すると、EmDashはその値を翻訳先のエントリーに同期します。

予約済みのフィールドのスラッグ

次のスラッグは予約済みのため、使えません。

  • id
  • slug
  • status
  • author_id
  • primary_byline_id
  • created_at
  • updated_at
  • published_at
  • scheduled_at
  • deleted_at
  • version
  • live_revision_id
  • draft_revision_id
  • terms
  • bylines
  • byline

TypeScriptの型

プログラムから使うために、フィールドの型の定義をインポートします。

import type { FieldType, Field, CreateFieldInput } from "emdash";

const fieldTypes: FieldType[] = [
	"string",
	"text",
	"url",
	"number",
	"integer",
	"boolean",
	"datetime",
	"select",
	"multiSelect",
	"portableText",
	"image",
	"file",
	"reference",
	"json",
	"slug",
	"repeater",
];