当ブログの投稿・更新・予約公開は、ほぼすべてWordPress REST API経由の自動処理です。Claude Codeと一緒にこの仕組みを作る過程で分かった実務のコツと、ドキュメントだけでは気づきにくい罠をまとめます。
対象環境
– WordPress(テーマ: Cocoon)+ レンタルサーバー
– 認証: アプリケーションパスワード(WP標準機能)
– クライアント: Python(requests)/実施時点: 2026年7月
認証:アプリケーションパスワードで十分
WP管理画面の「ユーザー → プロフィール」で発行できるアプリケーションパスワードを使い、Basic認証で叩くだけです。本パスワードと違い、用途ごとに発行・失効でき、権限も本体アカウントに従います。
import requests
auth = ("ユーザー名", "アプリケーションパスワード")
r = requests.post(
"https://example.com/wp-json/wp/v2/posts",
json={"title": "タイトル", "content": "<p>本文</p>", "status": "draft"},
auth=auth, timeout=30,
)
秘密情報は環境変数(CIではSecrets)からのみ渡し、コードにもリポジトリにも残さない——これは鉄則です。
実務で使うエンドポイントは5つで足りる
| やりたいこと | エンドポイント | メモ |
|---|---|---|
| 投稿の作成・更新 | /wp-json/wp/v2/posts |
slug で冪等に。excerpt も設定可 |
| 予約公開 | 同上 | status: "future" + date(サイトのタイムゾーンで指定) |
| 画像アップロード | /wp-json/wp/v2/media |
返ってきたIDを featured_media に渡せばアイキャッチに |
| カテゴリ・タグ | /wp-json/wp/v2/categories /tags |
slugで検索→なければ作成、が安定 |
| メニュー編集 | /wp-json/wp/v2/menu-items |
フッターへの固定ページ追加もAPIでできる |
ハマった罠4つ
罠1:同じslugでPOSTすると重複記事ができる
create は同slugでも素通りし、my-post-2 が生えます。自動運用では必ず「slugで既存検索→あれば更新、なければ作成」の冪等パターンにします。定期ジョブは失敗リトライで二重実行される前提で書くこと。
罠2:予約投稿の date はタイムゾーンに注意
date はサイト設定のタイムゾーンのローカル時刻、UTCで指定したいなら date_gmt。混ぜると「朝7時の予定が夕方に公開」が起きます。どちらか一方に統一を。
罠3:settings エンドポイントで触れるのは一部だけ
サイト設定の多く(テーマ独自の設定——たとえばCocoonの「ヘッド用コード」など)はREST APIでは操作できません。テーマ設定はDBの別領域にあり、REST経由の自動化対象外と割り切って、そこだけ管理画面での手作業に残しています。「どこまでAPIで届くか」を最初に確認しておくと設計を誤りません。
罠4:更新したのに反映されない——サーバーキャッシュ
更新APIは成功しているのにページが古いまま、の原因はレンタルサーバー側のページキャッシュでした。投稿の公開・更新時は自動でキャッシュが飛ぶ設定でも、REST経由の一部操作では飛ばないことがある。検証時はキャッシュを疑い、curlに ?nocache=1 のようなクエリを付けて素の応答を確かめると切り分けが速いです。
Claude Codeと組むときのコツ
- 「冪等に」「リトライ前提で」と最初に指定する。事故るのは正常系ではなく再実行時
- 変更系の操作は、まず
GETで対象を確認するコードを書かせてからPOST/PUTに進む - 記事の一括修正(バックフィル)は、対象一覧を先に出力させて人間が確認してから実行する
持ち帰り
- アプリケーションパスワード+REST APIで、投稿・予約・タグ・アイキャッチまで自動化できる
- 自動運用の要は冪等性(slug検索→更新)とタイムゾーンの統一
- テーマ独自設定とキャッシュはRESTの外。「APIで届かない領域」を把握して手作業を最小化する
※本記事は当サイトの運用記録(教育目的)です。記載の仕様は実施時点のもので、変更される可能性があります。

コメント