Claude Code × WordPress REST APIで記事の投稿・編集を自動化してみた

AI

ブログの記事執筆、WordPress管理画面でやるの地味に面倒じゃないか?

下書きを書いて、プレビューして、修正して、また管理画面に戻って……。記事の中身を考えることに集中したいのに、WordPressのUI操作に時間を取られる

そこで、Claude Code(Anthropic製のAIコーディングツール)からWordPressのREST APIを叩いて、記事の投稿・編集を全部ターミナルから完結させてみた

結論から言うと、思った以上に実用的だった。この記事では、セットアップ手順と実際のワークフロー、そしてハマりポイントをまとめる。

WordPressのREST APIは最初から使える

意外と知られていないが、WordPressのREST APIはデフォルトで有効になっている。特に設定は不要で、以下のURLにアクセスすれば記事一覧がJSONで返ってくる。

https://あなたのサイト/wp-json/wp/v2/posts

ただし、認証なしでアクセスできるのは読み取り(GET)のみ。公開済みの記事タイトルや本文は誰でも取得できるが、記事の作成・編集・削除には認証が必要になる。

セットアップ手順

1. Application Passwordsの発行

WordPress 5.6以降に標準搭載されている「アプリケーションパスワード」を使う。プラグインは不要。

  1. WordPress管理画面 → ユーザー → プロフィール
  2. 下にスクロールして「アプリケーションパスワード」セクションを見つける
  3. 名前に「claude-code」など適当に入力
  4. 「新しいアプリケーションパスワードを追加」をクリック
  5. 表示されたパスワードをコピー(一度しか表示されないので注意

ここで注意点がひとつ。自分で入力した名前(例:claude-code)はただのラベルであって、パスワードではない。実際のパスワードは自動生成されるスペース区切りの文字列(例:GobM RrAZ imAq YLE5 Kp7O aNK1)の方だ。筆者はここで盛大に間違えた。

2. 動作確認

Claude Codeから以下のようなリクエストで下書き投稿ができる。

curl -X POST "https://あなたのサイト/wp-json/wp/v2/posts" \
  -u "ユーザー名:アプリケーションパスワード" \
  -H "Content-Type: application/json" \
  -d '{"title":"テスト投稿","content":"<p>Claude Codeからのテスト</p>","status":"draft"}'

WordPress管理画面の「投稿」→「下書き」にテスト記事が入っていれば成功。

実際のワークフロー

記事の新規投稿

Claude Codeに「こういう記事を書いて、下書きで投稿して」と伝えるだけ。AIが記事を生成し、REST API経由でWordPressに下書き投稿してくれる。

ポイントは必ずstatusをdraftにすること。いきなり公開(publish)にすると取り返しがつかないので、下書き→管理画面で確認→公開、の流れが安全。

公開済み記事の編集

既存記事の編集も可能だが、WordPressには「公開済み記事の編集下書き」機能がない。更新ボタンを押したら即反映されてしまう。

そこで、REST APIで擬似的な「編集下書き」ワークフローを組んだ。

  1. 公開記事のコピーを下書きとして作成 — REST APIで元記事のコンテンツをGETし、新規下書きとしてPOST
  2. 下書きを編集 — Claude Codeにセクションの追加や修正を指示
  3. プレビューで確認 — WordPress管理画面で下書きをプレビュー
  4. 本番に反映 — 下書きのコンテンツを元記事にPOSTで上書き
  5. 下書きコピーを削除 — 管理画面からゴミ箱へ

Yoast Duplicate Postなどのプラグインを入れなくても、REST APIだけで同じことができる。

ハマりポイント

SiteGuardがPUTメソッドをブロックする

セキュリティプラグイン「SiteGuard WP Plugin」を入れている場合、PUTメソッドが403 Forbiddenで弾かれることがある。

REST APIの記事更新は通常PUTを使うが、実はWordPressのREST APIはPOSTメソッドでも記事の更新を受け付ける。POSTで送ればSiteGuardに弾かれずに更新できた。

ただし、DELETEメソッドもブロックされるため、下書きコピーの削除だけは管理画面から手動で行う必要がある。

Application Passwordの罠

前述の通り、自分で入力した名前をパスワードだと勘違いして401エラーで30分溶かした。自動生成されたスペース区切りの文字列が本物のパスワードだ。これは声を大にして言いたい。

Cocoonのメタフィールドが書けない

WordPressテーマ「Cocoon」のSEOタイトルやメタディスクリプションは、REST API経由では書き込めなかった。Cocoonがカスタムフィールドをrest_apiに公開していないためと思われる。

タイトル・本文・スラッグ・カテゴリなどWordPress標準のフィールドは問題なく操作できるが、テーマ独自のフィールドは管理画面で手動入力する必要がある

できること・できないことまとめ

操作 REST API 備考
記事の読み取り 認証不要
下書き投稿 Application Password必要
記事の更新 POSTメソッドで送る(SiteGuard対策)
記事の削除 SiteGuardにブロックされる場合あり
カテゴリ・タグ設定
スラッグ変更
SEOタイトル(Cocoon) × 管理画面で手動入力
メタディスクリプション(Cocoon) × 管理画面で手動入力
アイキャッチ画像 メディアIDを指定すれば可能

セキュリティの注意点と改善案

REST APIで記事を操作できるのは便利だが、「AIに本番環境の書き込み権限を渡している」という事実は忘れてはいけない。いくつかリスクと対策を整理しておく。

AIの暴走リスク

Claude Codeは基本的にユーザーの指示通りに動くが、指示の解釈を間違える可能性はゼロではない。たとえば「この記事を修正して」のつもりが、別の記事を上書きしてしまうようなケースは起こり得る。

対策としては、この記事で紹介した「必ずdraftで投稿する」ルールが最低限の安全弁になる。statusをpublishにする操作は、管理画面から人間が行うのが無難だ。

より厳重にやるならステージング環境

本当に安全にやりたいなら、ステージングサイトを別途用意して、Claude Codeにはステージング側のApplication Passwordだけを渡すのがベストプラクティスだ。

  1. ステージング環境(Local、MAMP、サブドメインなど)を用意
  2. Claude Codeにはステージング側の認証情報のみ渡す
  3. ステージングで下書き→確認→問題なければ本番に手動で反映

こうすればClaude Codeが万が一暴走しても、本番サイトには一切影響しない。記事数が増えてきたり、複数人で運営する場合は、この構成を検討する価値がある。

Application Passwordの管理

  • 権限は最小限に:Application Passwordは発行したユーザーの権限をそのまま引き継ぐ。可能であれば「投稿者」ロールの専用ユーザーを作り、そのユーザーでApplication Passwordを発行するのが理想
  • 不要になったら即削除:ユーザープロフィール画面から、使わなくなったApplication Passwordはすぐに無効化できる
  • パスワードの保管:Application Passwordを平文でスクリプトに書くのは避けたい。環境変数や.envファイル(.gitignoreに追加)で管理するのが望ましい

REST APIのアクセス制限

REST APIをそもそも外部に公開したくない場合は、以下の対策も有効。

  • IPアドレス制限:.htaccessやサーバー設定でwp-json/へのアクセスを自宅IPに限定
  • REST API制限プラグイン:認証なしのREST APIアクセスを無効化するプラグインを導入
  • WAFルール:Cloudflareなどを使っている場合、wp-json/へのアクセスに追加のルールを設定

筆者の環境では、SiteGuardがPUT/DELETEをブロックしてくれているので、意図せず記事が消えるリスクは低い。ただしPOSTは通るので、記事の作成・上書きは可能な状態であることは認識しておくべきだ。

まとめ

Claude Code × WordPress REST APIの組み合わせで、記事の投稿から編集まで管理画面を開かずに完結できるようになった。

特に便利だと感じたのは、公開済み記事の編集ワークフロー。下書きコピーを作って、AIに修正を指示して、確認後に本番反映。プラグインなしでこれができるのは大きい。

ただし、SiteGuardとの相性やCocoon固有フィールドの制約など、ハマりポイントもある。この記事がWordPressとAIツールを連携させたい人の参考になれば幸いだ。

ちなみにこの記事自体も、Claude CodeからREST API経由で下書き投稿している。

コメント

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