このブログ、久しぶりに更新しています。
実はこの記事、AIが書いて、AIがWordPressに下書きとして入れたものです。私がやったのは、プレビューを見て「公開して」と言ったことだけ。
今回はその仕組みと、作ってみて分かった落とし穴をまとめます。
全体の流れ
やっていることはシンプルで、次の4ステップです。
- AIに「〇〇について記事を書いて」と頼む
- AIが原稿(Markdown)を書き、WordPressの REST API で下書きとして入稿する
- 人間がWordPressのプレビューで確認する
- OKなら「公開して」と一言。AIが公開に切り替える
使っているのは Claude Code(ターミナルで動くAIエージェント)と、WordPress標準の アプリケーションパスワード だけです。プラグインは入れていません。
一番大事にしたルール:公開ボタンは人間が押す
AIに全部任せることもできますが、あえて 「下書きまではAI、公開は人間の一言」 に線を引きました。
理由は3つです。
- 公開は外向きの行為。一度出た記事は、消してもキャッシュや検索結果に残ります
- AIはそれっぽく間違える。事実確認やトーンの最終判断は人間がやるべき
- 権限を絞れる。AI用のユーザーは「編集者」権限にして、管理者権限は渡さない
これを「お約束」ではなく、ツール側の仕組みで守っています。
- 入稿コマンドは下書きしか触れない。公開済みの記事を書き換えようとすると止まる
- 公開コマンドは、AIが自分で入れた記事にしか効かない
- 管理画面で人間が手直しした下書きは、AIが勝手に上書きしない(更新日時で検知)
| 作業 | 誰がやるか |
|---|---|
| 記事を書く・下書きを入れる | AI |
| プレビューで確認する | 人間 |
| 公開する | 人間の「公開して」の後に AI |
| 公開済み記事の修正 | 人間(管理画面) |
準備したこと
1. AI専用ユーザーを作る
管理画面で「編集者」権限のユーザーを作り、そのユーザーで アプリケーションパスワード を発行します。普段のログインパスワードとは別物で、いつでも個別に取り消せるのが利点です。
2. パスワードは暗号化して保管
発行したパスワードは、暗号化した保管庫(vault)に入れて、AIは実行時にだけ読み出します。設定ファイルやコードには書きません。
3. 原稿はMarkdownで書く
AIが書く原稿はこんな形です。
---
title: 記事のタイトル
slug: my-first-post
---
## 見出し
本文……
見出し・箇条書き・表・コードなど、よく使う書式はそのままHTMLに変換して入稿します。
実際に踏んだ落とし穴
作るより、ここで時間を使いました。同じ構成(WordPress + Cloudflare)の方の参考になれば。
落とし穴1:Cloudflareに機械アクセスとして弾かれる
Pythonの標準ライブラリでAPIを叩いたら、error code: 1010 で全部拒否されました。Cloudflareは、プログラム既定の User-Agent を「怪しいボット」とみなして弾くことがあります。独自の User-Agent を付けると通りました。
落とし穴2:ユーザー列挙対策が、自分の管理画面まで壊す
WordPressは /wp-json/wp/v2/users で投稿者名が外から見えてしまうので、Cloudflare側でこのURLを塞いでいました。
ところが、管理画面で「アプリケーションパスワードを追加」を押すと、中身が空っぽの赤いエラー枠が出るだけで何も起きない。原因は、このボタンが裏で同じ /wp/v2/users/… を呼んでいたことでした。エラー文が出ないので、気づくまでに時間がかかりました。
発行するときだけルールを一時停止し、発行が終わったらすぐ戻す、で解決しています。
落とし穴3:URLの塞ぎ方に抜け道がある
さらに調べると、WordPressは /?rest_route=/wp/v2/users という書き方でも同じAPIを受け付けます。パス(URLの /wp-json/… 部分)だけを見るルールだと、ここが素通りでした。クエリ文字列側も条件に入れて塞いでいます。
ユーザー列挙対策をCloudflareでやっている方は、
?rest_route=の形でも塞がっているか、一度確認してみてください。
落とし穴4:通信が途中で切れたら「二重投稿」になりかける
サーバーが記事を保存した後に応答だけ切れると、AIは「失敗した」と思ってもう一度送ろうとします。そうすると同じ記事が2本できてしまう。
そこで、送り直す前に「同じ記事がもう入っていないか」を確かめるようにしました。入っていればそれを採用し、確認できなければ止まって人間に聞きます。
やってみての感想
- 記事を書く手間より、「どこまでAIに任せるか」の線引きを決めるほうが大事でした
- 線引きを「お願い」ではなく仕組み(権限・コマンドの制限)で守ると、安心して任せられます
- 落とし穴の多くは、AIではなくセキュリティ設定との相性でした。守りを固めているサイトほど、自分のツールも弾かれます
今後はこの仕組みで、止まっていたこのブログを少しずつ動かしていく予定です。