title | description | type | service | stub | i18nReady |
---|---|---|---|---|---|
ButterCMSとAstro |
ButterCMSを使ってコンテンツをAstroプロジェクトへ追加する |
cms |
ButterCMS |
false |
true |
import { Steps } from '@astrojs/starlight/components'; import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro'
ButterCMSは、プロジェクトで利用できる構造化されたコンテンツを公開可能なヘッドCMSとブログエンジンです。
:::note 完全なブログサイトの例については、Astro + ButterCMS スタータープロジェクトをご覧ください。 :::
このセクションでは、ButterCMS SDKを使ってデータをAstroプロジェクトに取り込む方法を解説します。
始めるには以下の手順に従ってください。
-
Astroプロジェクト - もしAstroプロジェクトをまだ持っていない場合は、自動CLIでAstroをインストールを見ると、すぐに使い始めることができます。
-
ButterCMSアカウント - もしアカウントを持っていない場合は、無料トライアルとして登録できます。
-
ButterCMS APIトークン - SettingsページからAPIトークンを見つけることができます。
```ini title=".env"
BUTTER_TOKEN=APIトークンをここに記載
```
:::tip
[環境変数](/ja/guides/environment-variables/)のAstroの`.env`ファイルについてをご覧ください。
:::
-
ButterCMS SDKを依存関係としてインストールします。
```shell pnpm add buttercms ``` ```shell yarn add buttercms ```npm install buttercms
-
プロジェクトに
src/lib/
を作り、そこへbutter.cms.js
を作成します。import Butter from "buttercms"; export const butterClient = Butter(import.meta.env.BUTTER_TOKEN);
これは、APIトークンを使用してSDKの認証を行い、プロジェクト全体で利用するためにエクスポートします。
コンテンツを取得するために、このクライアントをインポートして、その中のretrieve
関数を使用します。
このサンプルでは、ショートテキストのname
と数字のprice
、そしてWYSIWYGのdescription
の3フィールドを持つコレクションを取得します。
---
import { butterClient } from "../lib/buttercms";
const response = await butterClient.content.retrieve(["shopitem"]);
interface ShopItem {
name: string,
price: number,
description: string,
}
const items = response.data.data.shopitem as ShopItem[];
---
<body>
{items.map(item => <div>
<h2>{item.name} - ${item.price}</h2>
<p set:html={item.description}></p>
</div>)}
</body>
インターフェイスはフィールドタイプを反映しています。WYSIWYGのdescription
フィールドはHTML文字列としてロードされ、set:html
を使い描画します。
同様にページを取得してフィールドを表示できます。
---
import { butterClient } from "../lib/buttercms";
const response = await butterClient.page.retrieve("*", "simple-page");
const pageData = response.data.data;
interface Fields {
seo_title: string,
headline: string,
hero_image: string,
}
const fields = pageData.fields as Fields;
---
<html>
<title>{fields.seo_title}</title>
<body>
<h1>{fields.headline}</h1>
<img src={fields.hero_image} />
</body>
</html>
- 追加してください!