MENU

【Python不要】GASでWordPressに記事を投稿する方法|REST APIで安全に下書き作成

当ページのリンクには広告(PR)が含まれていることがあります。
GASからWordPressへREST APIで下書き投稿するイメージ

「WordPressに自動で記事を入れたいけど、Pythonを入れていない」

「会社PCなので環境構築ができない」

「GoogleスプレッドシートやGoogleドキュメントから、そのままWordPressに下書きを作りたい」

こういう場面、けっこうあります。

なべくんです。

結論から言うと、Pythonがなくても、Google Apps Script(GAS)だけでWordPressに記事を投稿できます。

GASには外部URLへリクエストを送る UrlFetchApp があり、WordPress側には記事を作成できるREST APIがあります。この2つを組み合わせると、ブラウザ上のApps ScriptエディタだけでWordPressの下書き記事を作れます。

ただし、最初から自動公開するのはおすすめしません。まずは draft、つまり下書きとして投稿し、管理画面で表示を確認してから公開する流れが安全です。

目次

この記事で分かること

  • PythonなしでGASからWordPressへ下書き投稿する方法
  • Application PasswordをGASのスクリプトプロパティで安全に扱う方法
  • 401、403、400エラーが出たときの切り分け方

先に注意点

GASでWordPress投稿を自動化する場合、便利さより先に安全面を押さえておきましょう。

注意点 理由
最初は draft で投稿する 本文崩れやカテゴリ間違いのまま公開されるのを防ぐため
Application Passwordをコードに直書きしない 共有やコピー時に認証情報が漏れる可能性があるため
GASの共有範囲に注意する スクリプトを共有すると、編集者が設定やコードを触れるため
大量投稿前に1件だけテストする 同じ記事を連投する事故を防ぐため
不要になったApplication Passwordは削除する 使わない認証口を残さないため

この記事では、GASのコード内にパスワードを書かず、スクリプトプロパティから読み込む形にします。

検証環境

この記事では、次の環境を前提にしています。

項目 内容
WordPress 6.9.4
テーマ SWELL 2.16.0
PHP 8.3.30
実行環境 Google Apps Script
使用サービス UrlFetchApp / PropertiesService

WordPress公式ドキュメントでは、記事作成は POST /wp/v2/posts で行う形になっています。また、Application PasswordはREST APIなどのプログラム連携用に使える、個別に取り消し可能な認証情報です。

Google Apps Script側では、UrlFetchApp.fetch(url, params) で外部URLにリクエストを送れます。認証情報の保存には、キーと値を保存できる PropertiesService を使います。

参考:

GASでWordPress投稿する全体像

今回やることは、次の流れです。

GASからWordPress REST APIへ記事データを送り下書き作成する流れ
GASからREST APIを通じてWordPress下書きを作成する全体像。
  1. WordPressでApplication Passwordを作る
  2. GASのスクリプトプロパティに認証情報を保存する
  3. GASからWordPress REST APIへPOSTする
  4. WordPressに下書き記事を作る
  5. 管理画面で確認してから公開する

ポイントは、GASは投稿ボタンを押す代わりに、WordPressのREST APIへ記事データを送るだけということです。

Python版とGAS版の違い

どちらもWordPress REST APIを使う点は同じです。

違いは、実行する場所です。

比較項目 Python GAS
実行場所 ローカルPC / Colab / サーバー ブラウザ上のApps Script
環境構築 Pythonやライブラリが必要 Googleアカウントがあれば始めやすい
相性が良い作業 ファイル処理、AI連携、スクレイピング Googleスプレッドシート連携、軽い自動化
注意点 ライブラリ管理、実行環境 実行時間、権限、共有範囲

「Pythonを入れるところで止まる」という方は、まずGAS版で下書き投稿まで試すのがおすすめです。

準備1: WordPressでApplication Passwordを作る

WordPress管理画面で、次の順に進みます。

  1. WordPress管理画面にログイン
  2. ユーザー → プロフィールを開く
  3. Application Passwordsの欄を探す
  4. GAS投稿テスト のような名前を付ける
  5. 生成されたパスワードをコピーする

Application Passwordは、通常のログインパスワードとは別物です。

管理画面へのログインには使わず、GASや外部ツールからREST APIを呼び出すために使います。

WordPress公式ドキュメントにもある通り、Application Passwordは作成後に一度しか表示されません。コピーし忘れた場合は、削除して作り直しましょう。

準備2: Apps Scriptプロジェクトを作る

以下の手順でGASプロジェクトを作成します。

  1. Google Apps Script を開く
  2. 新しいプロジェクトを作成
  3. プロジェクト名を WordPress投稿テスト などに変更
  4. コード.gs に後ほど紹介するコードを貼り付ける

Googleスプレッドシートから使いたい場合は、スプレッドシートの「拡張機能 → Apps Script」から作成してもOKです。

準備3: スクリプトプロパティに認証情報を保存する

GASの画面で、次の順に設定します。

  1. Apps Scriptエディタ左側の歯車アイコン「プロジェクトの設定」を開く
  2. 「スクリプト プロパティ」を探す
  3. 「スクリプト プロパティを追加」をクリック
  4. 以下の3つを追加する
プロパティ 値の例
WP_SITE_URL https://example.com
WP_USERNAME your_login_name
WP_APP_PASSWORD xxxx xxxx xxxx xxxx xxxx xxxx

WP_SITE_URL はWordPressサイトのURLです。末尾の / はあってもなくても動くようにコード側で処理します。

WP_USERNAME はWordPressのログインユーザー名です。表示名ではなく、REST API認証に使うユーザー名を入れます。

WP_APP_PASSWORD は先ほど作成したApplication Passwordです。スペース付きで貼っても、コード側でスペースを削除します。

Application PasswordをGASのスクリプトプロパティから読み込む安全な流れ
Application Passwordはコードに直書きせず、スクリプトプロパティから読み込みます。

〖コピペOK〗GASでWordPressに下書き投稿するコード

以下のコードを コード.gs に貼り付けます。

function createWordPressDraft() {
  const props = PropertiesService.getScriptProperties();

  const siteUrl = props.getProperty('WP_SITE_URL').replace(/\/$/, '');
  const username = props.getProperty('WP_USERNAME');
  const appPassword = props.getProperty('WP_APP_PASSWORD').replace(/\s/g, '');

  if (!siteUrl || !username || !appPassword) {
    throw new Error('WP_SITE_URL、WP_USERNAME、WP_APP_PASSWORDをスクリプトプロパティに設定してください。');
  }

  const endpoint = `${siteUrl}/wp-json/wp/v2/posts`;

  const payload = {
    title: 'GASから作成したテスト記事',
    slug: 'gas-rest-api-test-post',
    status: 'draft',
    content: `
      <h2>これはGASから作成した下書きです</h2>
      <p>Google Apps ScriptのUrlFetchAppを使って、WordPress REST APIへ投稿しています。</p>
      <p>最初は下書きで作成し、管理画面で確認してから公開しましょう。</p>
    `,
    categories: [12]
  };

  const token = Utilities.base64Encode(`${username}:${appPassword}`);

  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      Authorization: `Basic ${token}`
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(endpoint, options);
  const statusCode = response.getResponseCode();
  const responseBody = response.getContentText();

  Logger.log(`status: ${statusCode}`);
  Logger.log(responseBody);

  if (statusCode < 200 || statusCode >= 300) {
    throw new Error(`記事作成に失敗しました。status: ${statusCode} / body: ${responseBody}`);
  }

  const post = JSON.parse(responseBody);
  Logger.log(`下書きを作成しました: ${post.link}`);
  Logger.log(`記事ID: ${post.id}`);
}

ポイントは、status: 'draft' です。

ここを publish にすると即公開になりますが、最初は必ず下書きで試してください。

初回実行時の権限確認

GASで UrlFetchApp を使うと、初回実行時に外部サービスへ接続する権限確認が出ます。

手順は次の通りです。

  1. 関数選択で createWordPressDraft を選ぶ
  2. 「実行」をクリック
  3. 権限確認画面でGoogleアカウントを選ぶ
  4. 内容を確認して許可する
  5. 実行ログを確認する

成功すると、ログに次のような情報が出ます。

status: 201
下書きを作成しました: https://example.com/gas-rest-api-test-post/
記事ID: 123

下書き記事は、WordPress管理画面の投稿一覧から確認できます。

カテゴリIDを確認するコード

記事にカテゴリを付ける場合は、カテゴリ名ではなくIDを指定します。

カテゴリIDが分からない場合は、次のGASコードで確認できます。

function listWordPressCategories() {
  const props = PropertiesService.getScriptProperties();
  const siteUrl = props.getProperty('WP_SITE_URL').replace(/\/$/, '');
  const endpoint = `${siteUrl}/wp-json/wp/v2/categories?per_page=100`;

  const response = UrlFetchApp.fetch(endpoint, {
    method: 'get',
    muteHttpExceptions: true
  });

  const statusCode = response.getResponseCode();
  const responseBody = response.getContentText();

  if (statusCode < 200 || statusCode >= 300) {
    throw new Error(`カテゴリ取得に失敗しました。status: ${statusCode} / body: ${responseBody}`);
  }

  const categories = JSON.parse(responseBody);

  categories.forEach(category => {
    Logger.log(`${category.id}: ${category.name} (${category.slug})`);
  });
}

ログにカテゴリID、カテゴリ名、スラッグが表示されます。

投稿コード内の categories: [12] は、自分のサイトのカテゴリIDに合わせて変更してください。

カテゴリを指定しない場合は、categories の行ごと削除しても動きます。

タグを付けたい場合

タグもカテゴリと同じく、タグIDを指定します。

投稿時にタグを付ける場合は、payloadtags を追加します。

const payload = {
  title: 'GASから作成したテスト記事',
  status: 'draft',
  content: '<p>本文です。</p>',
  categories: [12],
  tags: [24, 25]
};

タグIDを調べるエンドポイントは次の通りです。

https://example.com/wp-json/wp/v2/tags

まずはカテゴリだけで動作確認し、慣れてからタグを追加するのがおすすめです。

下書きを公開に切り替えるコード

下書き作成後、管理画面で本文やカテゴリを確認します。

問題なければ、管理画面から公開してもよいですし、GASから statuspublish に変更することもできます。

function publishWordPressPost() {
  const props = PropertiesService.getScriptProperties();

  const siteUrl = props.getProperty('WP_SITE_URL').replace(/\/$/, '');
  const username = props.getProperty('WP_USERNAME');
  const appPassword = props.getProperty('WP_APP_PASSWORD').replace(/\s/g, '');

  const postId = 123; // 公開したい記事IDに変更してください
  const endpoint = `${siteUrl}/wp-json/wp/v2/posts/${postId}`;

  const token = Utilities.base64Encode(`${username}:${appPassword}`);

  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      Authorization: `Basic ${token}`
    },
    payload: JSON.stringify({
      status: 'publish'
    }),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(endpoint, options);
  const statusCode = response.getResponseCode();
  const responseBody = response.getContentText();

  if (statusCode < 200 || statusCode >= 300) {
    throw new Error(`公開処理に失敗しました。status: ${statusCode} / body: ${responseBody}`);
  }

  const post = JSON.parse(responseBody);
  Logger.log(`公開しました: ${post.link}`);
}

ただし、最初の運用では以下の流れが安全です。

  1. GASで下書き作成
  2. WordPress管理画面で表示確認
  3. アイキャッチ、カテゴリ、タグ、本文崩れを確認
  4. 問題がなければ管理画面から公開

GASからの自動公開は、下書き作成に慣れてからで十分です。

よくあるエラーと原因

GASからWordPressへ投稿するときに詰まりやすいエラーを整理します。

GASからWordPress投稿するときの401 403 400エラー切り分け図
GASの実行ログでstatusCodeとresponseBodyを見ながら原因を切り分けます。
エラー よくある原因 次にやること
401 rest_not_logged_in ユーザー名、Application Password、Authorizationヘッダーの問題 WP_USERNAMEWP_APP_PASSWORD を確認する
403 rest_cannot_create 投稿権限がない、REST APIが制限されている 投稿できるユーザーか、セキュリティ設定を確認する
400 invalid_param status、カテゴリID、タグIDなどが不正 レスポンス本文を読み、該当パラメータを修正する
404 rest_no_route REST APIのURLが間違っている /wp-json/wp/v2/posts のURLを確認する
GASの権限エラー 外部リクエスト権限を許可していない 初回実行時の権限確認をやり直す

GASでは muteHttpExceptions: true を入れておくと、エラー時にもレスポンス本文をログに出せます。

原因を切り分けるために、最初は必ず次の2行を確認しましょう。

Logger.log(`status: ${statusCode}`);
Logger.log(responseBody);

ステータスコードだけでなく、WordPress側のエラーメッセージを見るのが大事です。

401が出るときの確認ポイント

401 rest_not_logged_in が出る場合は、まず認証まわりを確認します。

  • WP_USERNAME が表示名ではなくログインユーザー名になっているか
  • WP_APP_PASSWORD に余計な文字が入っていないか
  • Application Passwordを削除済みにしていないか
  • WordPressサイトがHTTPSで開けるか
  • セキュリティプラグインやサーバー設定でREST APIが制限されていないか

特に、ユーザー名の間違いはよくあります。

WordPressの表示名が Watanabe でも、REST API認証に使うログイン名は別の場合があります。表示名ではなく、実際のユーザー名を使いましょう。

スプレッドシートから投稿したい場合の考え方

GASの強みは、Googleスプレッドシートとの相性です。

たとえば、シートに次の列を作っておくと、記事データを管理しやすくなります。

内容
A列 タイトル
B列 スラッグ
C列 本文HTML
D列 カテゴリID
E列 投稿ステータス

最初は1行だけ読み込んで下書き投稿し、慣れてから複数行に広げるのがおすすめです。

大量投稿をいきなり実行すると、同じ内容の記事を何件も作ってしまうことがあります。

まずは「1行だけ」「下書きだけ」で試しましょう。

実務で使うときの線引き

GASでのWordPress投稿は、次のような用途に向いています。

  • スプレッドシートで管理している記事案を下書き化する
  • 定型フォーマットの記事をまとめて作る
  • GoogleドキュメントやシートからWordPressへ原稿を移す
  • Python環境なしで軽い投稿自動化を試す

一方で、次の使い方は慎重にしましょう。

  • 内容確認なしで大量公開する
  • AI生成文をそのまま公開する
  • 1つのApplication Passwordを複数人で使い回す
  • 編集権限のあるGASプロジェクトを不用意に共有する

自動化は便利ですが、公開前の確認まで省くと事故につながります。

最初は「公開」ではなく、「下書き作成をラクにする道具」として使うのがおすすめです。

まとめ

Pythonを使わなくても、GASだけでWordPressに記事を投稿できます。

ポイントは次の3つです。

  • GASの UrlFetchApp でWordPress REST APIへPOSTする
  • Application Passwordはコードに直書きせず、スクリプトプロパティに保存する
  • 最初は draft で下書き作成し、管理画面で確認してから公開する

Python環境構築で止まっていた方でも、GASならブラウザだけで試せます。

まずは1件だけ下書きを作り、ログと管理画面を見ながら動きを確認していきましょう。

同じように「Pythonはないけど、WordPress投稿を少し自動化したい」と感じている方の助けになれば幸いです。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次