NodeJS で contentful-management を使う方法を想定してます。
準備
以下の流れでやっていきます。
依存のインストール
アクセストークンの取得
依存のインストール
まだpacakge.jsonが無いのであれば以下のコマンドで NodeJS プロジェクトを準備します。
yarn init -y以下でcontentful-managementをインストールします。
yarn add contentful-managementアクセストークンの取得
上部のメニューからcontentful-management画像の順番のように辿り、出てきたcontentful-management画像ダイアログに後で分かる名前を付けて Generate します。
生成されたアクセストークンはあとで参照できないので、大切に保存します。
処理を書く
取得から更新の流れは以下のようなフローです。
アクセストークンを使って通信する為の
clientを取得clientからspaceインスタンスを取得spaceからenvironmentインスタンスを取得environmentからentryインスタンスを取得フィールド更新
entry更新entry公開
アクセストークンを使って通信する為の client を取得
contentful-managementからcreateClientを取得し、それにアクセストークンに渡してclientを作ります。
const {createClient} = require('contentful-management');
const client = createClient({accessToken: ACCESS_TOKEN});
(async () => {
// これより以下はこの中に入る
})();これより以下はasync関数の中に入ります。
client から space インスタンスを取得
const space = await client.getSpace(SPACE_ID);スペースIDSPACE_IDを渡してspaceを取得します。このスペースIDは Contentful サイトの上部のメニューからcontentful-management画像ダイアログ画像の流れで取得できます。
spaceにもgetEntriesやgetEntryはありますが、contentful@^5.12.0上では使おうとすると「将来的に撤廃予定です。environmentから使ってください」というような警告メッセージが表示されます。
space から environment インスタンスを取得
environmentには環境名を入れます。何も弄ってなかったり無料プランの場合これはmasterになります。
const environment = await space.getEnvironment(ENVIRONMENT_ID);environment から entry インスタンスを取得
const entry = await env.getEntry(ENTRY_ID);エントリーIDENTRY_IDはエントリーを書くページの右サイドバーの Info のcontentful-management画像ダイアログ画像画像の位置から取得できます。
フィールド更新
値を更新するには単にfieldsに新しい値を代入して更新します。
entry.fields.title.ja = '新しいタイトル';entry 更新
投稿を更新するにはEntry#updateを実行します。これでエントリーの内容が更新されます。(公開はまだ)
const updatedEntry = await entry.update();entry 公開
Entry#publishを実行して公開します。
await updatedEntry.publish();問題がなければ更新されてるハズです!
注意点は必ずEntry#updateの戻り値を使うことです。もし以下のように実装した場合 API はエラーを返します。
await entry.update();
await entry.publish();{
"status": 409,
"statusText": "Conflict",
"message": "",
"details": {},
"request": {
"url": "https://api.contentful.com:443/spaces/jfvyr7b4oy3y/environments/master/entries/3uzCE52rkssyRkaFMPwhUF/published",
"headers": {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/vnd.contentful.management.v1+json",
"X-Contentful-User-Agent": "sdk contentful-management.js/5.12.0; platform node.js/v12.14.1; os macOS/18.7.0;",
"Authorization": "Bearer ...D8vrU",
"user-agent": "node.js/v12.14.1",
"Accept-Encoding": "gzip",
"X-Contentful-Version": 1856
},
"method": "put",
"payloadData": null
},
"requestId": "ac28b8c5beee6aecde8d1856b6cd4efc"
}entryはsys.versionプロパティを持ちますが、updateやpublish後に帰ってくるentryはこの値が更新されてます。恐らくですが、entryは「このバージョンではこういうことをやった」という感じの情報を持っていて、既に実行済みのバージョンで何かしようとすると上記のようなエラーが返ってくるのではと思います。
全体コード
const {createClient} = require('contentful-management');
const client = createClient({accessToken: ACCESS_TOKEN});
(async () => {
const space = await client.getSpace(SPACE_ID);
const environment = await space.getEnvironment(ENVIRONMENT_ID);
const entry = await env.getEntry(ENTRY_ID);
entry.fields.title.ja = '新しいタイトル';
const updatedEntry = await entry.update();
await updatedEntry.publish();
})();