Contentfulのコンテンツ(Entry)を一括で更新したい機会がありコードを書いたのでサンプルコードを残します。
エントリを一括更新するにはContentful Management APIを使用します。
各言語向けにライブラリが用意されており、今回はJavaScript版のライブラリを使用しています。(Nodeとブラウザの両方に対応している様です)
エントリーを取得&更新するコードのサンプル
以下のコードは、エントリーをまとめて取得して、1つづつ更新していく処理のサンプルになります。
ページングの処理は入っていないので必要に応じて追加してください。
const contentful = require('contentful-management');
(async () => {
const client = contentful.createClient({
accessToken: '<CONTENTFUL_MANAGEMENT_TOKEN>'
});
const space = await client.getSpace('<SPACE_ID>');
const environment = await space.getEnvironment('master');
const entries = await environment.getEntries({
content_type: 'your content type',
limit: 1000,
});
const total = entries.total;
for (let i = 0; i < total; i++) {
const entry = entries.items[i];
// 公開状態ではないEntryはスキップする
if (!entry.isPublished()) {
console.log('スキップ', {i, total, id: entry.sys.id});
continue;
}
console.log('更新開始', {i, total, id: entry.sys.id});
/*
* ココにエントリーを変更する処理を書く
*/
entry.fields.sampleText = 'aaaa'
try {
// 更新と公開を行う
await (await entry.update()).publish();
} catch (e) {
console.error('更新失敗', {i, total, id: entry.sys.id});
console.error(e);
}
}
})();
API制限について
リクエスト回数に制限があり1秒あたり7回が上限のようです。
今回はこの制限に引っかからないために1つづつ更新を行っています。
以上です!
Webエンジニアをやっています
UX/UIデザインからプログラミング、DB設計、SEO、インフラ構築など幅広く対応してます
PHP/PHPUnit/Laravel/Vue/Nuxt/Docker/Terraform
ご連絡はTwitterのDMまで。
