WordPressをGASで自動投稿できた

GAS

このブログはWordpressで運営しているのですが、今まで手動でWebアプリのGUIをポチポチしていました。
このブログに関してはそれでいいのですが、雑記の方ではテンプレを使った日記みたいな記事を投稿しています。
こういうテンプレを使いまわして日々投稿する系は、繰り返し作業が多くなるので時間が結構かかります。
情シスもエンジニアの端くれ、DRYの法則を適用して一括処理できるように工夫しようと思いました。

スポンサーリンク

まずはコードから

function postDraftToWordPress() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1");
  const data = sheet.getDataRange().getValues(); // 全行読み込み
  const startDate = new Date("2025-06-01"); // スプレッドシートに記載の日付との比較に使用
  const endDate = new Date("2025-06-30"); // スプレッドシートに記載の日付との比較に使用

  for (let i = 1; i < data.length; i++){
    const row = data[i];
    const dateOrg = row[0];       // A列:日付
    const date = new Date(dateOrg)
    if(date >= startDate && date <= endDate) {
      const pdate = Utilities.formatDate(dateOrg, "Asia/Tokyo", "M-d"); // パーマリンク用に整形(任意)
      const formatDate = Utilities.formatDate(dateOrg, "Asia/Tokyo", "M月d日") // タイトル用に整形(任意)
      const quote = row[4];      // B列:引用文

      // WordPressへの投稿処理
      const wordpressUrl = "https://blog.taibonn.com/wp-json/wp/v2/posts";
      const username = "******";  // WordPressログインユーザー名
      const appPassword = "**** **** **** **** **** ****"; // アプリケーションパス

      const credentials = Utilities.base64Encode(username + ":" + appPassword);
      const headers = {
        "Authorization": "Basic " + credentials,
        "Content-Type": "application/json"
      };

      const payload = {
        title: `『文読む月日』-${formatDate}`,
        content: 
          `
          <!-- wp:html -->
            <div class="wp-block-cocoon-blocks-micro-text micro-text micro-copy micro-top">
              <span class="micro-text-content micro-content">
                <a href="https://blog.taibonn.com/about-articles-of-reading-circle/" target="_blank" rel="noopener" title="">
                  この記事について
                </a>
              </span>
            </div>
          <!-- /wp:html -->
          <!-- wp:html -->
            <blockquote class="quote-box">
              ${quote}
            </blockquote>
          <!-- /wp:html -->
          <!-- wp:html -->
            <div class="wp-block-cocoon-blocks-micro-text alignright micro-text micro-copy micro-top">
              <span class="micro-text-content micro-content">
                『文読む月日』ちくま文庫 レフ・トルストイ 作 北御門二郎 訳
              </span>
            </div>
          <!-- /wp:html -->
          <!-- wp:html -->
            <hr class="wp-block-separator is-style-dotted">
          <!-- /wp:html -->
            `
          ,
        status: "draft",
        featured_media: 24,
        tags: [6],
        categories: [3,5],
        slug: `reading-circle-${pdate}`
      }

      const options = {
        method: "POST",
        headers: headers,
        payload: JSON.stringify(payload),
        muteHttpExceptions: true
      };

      const response = UrlFetchApp.fetch(wordpressUrl, options);
      Logger.log(date + ": " + response.getResponseCode());
    }
  }
}

GASです。スプレッドシートのコンテナバインドスクリプトでやっていますが、WordPressのRest APIを利用しますのでコンテナバインドスクリプトでなくても大丈夫です。

ちなみにWordpressのテーマはCocoonです。
記事の中身はpayloadの中のcontentに記載している物になります。
HTMLではなくJSONで記載されるGutenbergというブロックエディタの記載の仕方でコード中にそのまま記載しています。
ブロックエディタの中でHTMLを書くというちょっとどうなの、となるような内容かもしれませんがこれでいけてるのでいいでしょう。
(クラシックエディタ=HTMLの記載だと記述量が増える上になんか体裁が整わない・・・)

やっていること

WordPressに下書き記事を作成します。
下書き記事は6月1日~6月30日まで作成されます。(startDateとendDateで範囲を絞っています。)
内容は、payloadのcontentの通り、『文読む月日』という本の引用を日替わりで記載しています。
下書きができたら、その引用文に対する感想や知見を手動で書いて投稿しています。

この本は366日古今東西の箴言をトルストイが収集し、彼の思想に親和性のあるものを集めた箴言集となっており、毎日突っ込みを入れながら読むことができるのでおすすめです。
それをどうせなら記事にしていこうと思ってサブドメイン切ってブログにしています。

API投稿のための準備

①REST API接続の許可(サーバー設定)

WordPressをインストールしている環境にもよると思うのですが、私はXserverでホスティングしています。
デフォルトだとセキュリティ設定で「海外からのアクセスを制限する」というところにREST APIを制限するがオンになっていますから、これをオフにしてください。

そうすると、REST APIが通るようになります。
これをしないと、403エラーが返ってきて操作ができませんので注意が必要です。
なお、サーバーの設定によっては他の要因でアクセスできないことがあるかもしれません。
ChatGPTに聞いてください。
(Basic認証を拒否していたら上記のコードは動きません。)

②アプリケーションパスワードの取得(WordPress)

ワードプレスの管理画面で、ユーザーから自アカウントを選択し、ページ最下部のアプリケーションパスワードの名前を入力し、追加ボタンを押します。
名前は任意ですので、どのサービスで使っているアプリケーションパスワードか分かるように、「GAS(サービス内容)」とか入れておけばいいでしょう。

このボタンをおしたあとに表示されるアプリケーションパスワードをコピーしてGASのコード中の「appPassword」に記載してください。
(他人には知られないように気を付けてください。)
なお、usernameは同じ画面の上部で確認できるWordpressのユーザー名です。

③タグ、カテゴリ、アイキャッチ画像のID取得

APIで作成する記事にタグ、カテゴリ、アイキャッチ画像を設定するには、登録済みのこれらのIDを取得しておく必要があります。
WordPressの管理画面で確認できる場合もあると思いますが、ここではCURLコマンドを使ってIDを確認してみました。
CURLコマンドについてはWindows10から標準搭載されているので、コマンドプロンプトやPowershellからそのままつかえるはずです。
下記は確認方法の例です。<>の中は適宜読み替えて使ってください。

タグのIDを確認する場合

curl "https://<yourDomain>/wp-json/wp/v2/tags?search=<tagName>"

カテゴリのIDを確認する場合

curl "https://<yourDomain>/wp-json/wp/v2/categories?search=<categoryName>"

アイキャッチ画像のIDを確認する場合

アイキャッチ画像は画像のファイル名を確認してからCURLで確認します。
メディアファイルの一覧から、アイキャッチ画像にしたい画像のファイル名を確認します。

curl "https://<yourDomain>/wp-json/wp/v2/media?search=<fileName>"

これでタグ、カテゴリ、アイキャッチ画像をスクリプトで指定することができるようになりました。
payloadの中で各オブジェクトとして指定します。
タグやカテゴリは1つでも配列として記載してあげてください。

最後に概要

『文読む月日』は1年366日(閏年含)分、毎日色々なテーマで箴言がまとめてあります。
スプレッドシートに1月1日から12月31日まで1行に1文ずつ箴言をピックアップした表を持っています。
その表の情報をブログ記事にして1年分の下書きを一括で作成できるスクリプトになります。

スプレッドシート→GAS→REST API→Wordpress
という流れですね。

1記事1記事手動で作成して、タグとかパーマリンクとかカテゴリーとか設定するのは結構な手間だったので、こういう繰り返し作業は一括でできるように工夫できるようにするといいですね。

似たようなことしたいと思っている人がもしいたら参考になさってください。

コメント

タイトルとURLをコピーしました