Contentfulで管理しているブログ記事を一括更新する

公開日時
更新日時

Contentfulで管理している記事(content)を一括で更新したい場合、「Content Management API」を使うと手軽に更新ができる。

js SDKが提供されているのでこれを利用する。

yarn add contentful-management

Spaceの管理画面の「Content management tokens」でアクセストークンを発行し、↓のjsを実行すれば最大1000記事の文字列置換が一括で行える。

const contentful = require("contentful-management");

const sleep = (msec) => new Promise((resolve) => setTimeout(resolve, msec));

(async () => {
  const client = contentful.createClient({
    accessToken: process.env.ACCESS_TOKEN,
  });

  const space = await client.getSpace(process.env.SPACE_ID);
  const master = await space.getEnvironment("master");

  const entries = await master.getEntries({
    content_type: "post",
    limit: 1000,
  });

  const length = entries.items.length;
  for (let i = 0; i < length; i++) {
    const entry = entries.items[i];

    const content = entry.fields.content["ja-JP"]
    const updatedContent = content
      .replace(/Some/g, "some"); // TODO: 変換したい文字列を指定

    if (content !== updatedContent) {
      entry.fields.content = { "ja-JP": updatedContent };

      const updatedEntry = await entry.update();
      console.log(`updated: ${updatedEntry.sys.id}`);
      await sleep(200);
    } else {
      console.log(`skipped: ${entry.sys.id}`);
    }
  }
})();

秒間7requestのAPI制限があるので、1記事更新ごとに200msec sleepするようにしている。

By default the Contentful Management API enforces rate limits of 7 requests per second. Higher rate limits may apply depending on your current plan.

参考


Related #contentful

Contentfulで管理しているブログ記事を一括公開する

一括置換以外にも細かい調整を加えたかったため、更新と公開でスクリプトを分けることにした

Contentfulの記事をAlgoliaのインデックスに登録する

Contetful Webhookの変換Helperが便利

Contentful GraphQL APIで最終更新日時を取得する

sys.publishedAtで最終更新日時が取得できる

ContentfulのContent modelにvalidationを設定する

slugに正規表現のvalidationを設定した

Contentfulの料金プラン改定

嬉しいアップデート