WordPressで記事を書いていると、次のような作業で地味に時間を使うことがあります。
- 下書き記事を管理画面に毎回コピペしている
- タイトル、本文、カテゴリ、タグをまとめて登録したい
- 外部ツールで作った原稿をWordPressに流し込みたい
- 自動投稿を試したいけれど、パスワードや公開ミスが怖い
なべくんです。
結論から言うと、WordPress REST APIとApplication Passwordを使えば、PythonからWordPress記事を作成できます。
ただし、最初から publish で公開するのはおすすめしません。まずは draft、つまり下書きとして作成し、管理画面で表示を確認してから公開する流れが安全です。
この記事では、PythonでWordPressに下書き記事を作成する手順を、コピペしやすい形で解説します。
この記事で分かること
- WordPress REST APIで記事を作成する基本の考え方
- Application Passwordを使ったPython認証の書き方
- 401、403、400などのエラーが出たときの切り分け方
先に注意点
WordPress REST APIは便利ですが、扱い方を間違えると事故につながります。
特に以下の点は先に確認しておきましょう。
| 注意点 | 理由 |
|---|---|
最初は draft で作成する |
本文崩れやカテゴリ間違いのまま公開されるのを防ぐため |
| Application Passwordをコードに直書きしない | GitHubや共有ファイルに漏れると、外部から投稿される可能性があるため |
| HTTPSのサイトで使う | Basic認証の情報を安全に送るため |
| 不要になったApplication Passwordは削除する | 使わない認証口を残さないため |
| 自動投稿前に1件だけテストする | 大量投稿ミスを防ぐため |
この記事では、パスワードをPythonファイルに直接書かず、環境変数から読み込む形にします。
検証環境
この記事では、次の環境を前提にしています。
| 項目 | バージョン |
|---|---|
| WordPress | 6.9.4 |
| テーマ | SWELL 2.16.0 |
| PHP | 8.3.30 |
| Python | 3.10以上推奨 |
| ライブラリ | requests |
WordPressの公式ドキュメントでは、REST APIの投稿作成は POST /wp/v2/posts で行う形になっています。また、Application PasswordはAPI連携用の認証情報として使え、不要になったら個別に取り消せます。
参考:
WordPress REST APIで記事を作る仕組み
WordPress REST APIでは、次のURLにリクエストを送ることで記事を操作できます。
https://example.com/wp-json/wp/v2/posts
記事を作成するときは、HTTPメソッドに POST を使います。

ざっくり整理すると、次のようなイメージです。
| やりたいこと | メソッド | エンドポイント |
|---|---|---|
| 記事一覧を取得する | GET | /wp-json/wp/v2/posts |
| 新しい記事を作る | POST | /wp-json/wp/v2/posts |
| 特定の記事を更新する | POST | /wp-json/wp/v2/posts/{記事ID} |
通常のブログ運営でまず使うのは、下書き記事を作る POST /wp/v2/posts です。
準備1: Application Passwordを用意する
WordPress管理画面で、以下の順に進みます。
- WordPress管理画面にログイン
- ユーザー → プロフィールを開く
- Application Passwordsの欄を探す
- 分かりやすい名前を付ける
- 生成されたパスワードをコピーする
Application Passwordは、通常のログインパスワードとは別物です。
管理画面へのログインには使わず、Pythonや外部ツールからREST APIを呼び出すために使います。
また、生成後に画面へ再表示されないため、保存場所には注意してください。私は、記事投稿用・検証用・外部ツール用のように用途ごとに分けるのがおすすめです。
準備2: requestsをインストールする
PythonからHTTPリクエストを送るために、requests を使います。
ローカル環境では、以下を実行してください。
pip install requests
Google Colabで試す場合は、最初のセルに次のように書けばOKです。
!pip install requests
準備3: 環境変数に認証情報を入れる
パスワードをPythonファイルに直接書くと、あとから消し忘れや共有ミスが起きやすくなります。
WindowsのPowerShellなら、実行前に次のように設定します。
$env:WP_SITE_URL="https://example.com"
$env:WP_USERNAME="your_username"
$env:WP_APP_PASSWORD="xxxx xxxx xxxx xxxx xxxx xxxx"
MacやLinuxなら、次のように設定します。
export WP_SITE_URL="https://example.com"
export WP_USERNAME="your_username"
export WP_APP_PASSWORD="xxxx xxxx xxxx xxxx xxxx xxxx"
WP_SITE_URL はあなたのWordPressサイトURL、WP_USERNAME はWordPressのユーザー名、WP_APP_PASSWORD はApplication Passwordです。

〖コピペOK〗Pythonで下書き記事を作成する
以下のコードを create_wp_draft.py という名前で保存して実行します。
最初は必ず status を draft にしておきましょう。
import os
import requests
from requests.auth import HTTPBasicAuth
site_url = os.environ["WP_SITE_URL"].rstrip("/")
username = os.environ["WP_USERNAME"]
# WordPressのApplication Passwordはスペース付きで表示されることがあります。
# 認証時はスペースを消しても使えます。
app_password = os.environ["WP_APP_PASSWORD"].replace(" ", "")
endpoint = f"{site_url}/wp-json/wp/v2/posts"
payload = {
"title": "REST APIから作成したテスト記事",
"slug": "rest-api-test-post",
"status": "draft",
"content": """
<h2>これはREST APIから作成した下書きです</h2>
<p>Pythonのrequestsを使って、WordPressに記事を作成しています。</p>
<p>管理画面で表示を確認してから公開しましょう。</p>
""",
# カテゴリIDはサイトごとに異なります。不要ならこの行を削除してください。
"categories": [10],
}
response = requests.post(
endpoint,
auth=HTTPBasicAuth(username, app_password),
json=payload,
timeout=30,
)
if response.status_code not in (200, 201):
print("記事作成に失敗しました")
print("status:", response.status_code)
print(response.text)
response.raise_for_status()
post = response.json()
print("下書きを作成しました")
print("記事ID:", post["id"])
print("確認URL:", post["link"])
実行します。
python create_wp_draft.py
成功すると、記事IDと確認URLが表示されます。
下書きを作成しました
記事ID: 123
確認URL: https://example.com/rest-api-test-post/
下書きの場合、ログインしていない状態では表示できないことがあります。管理画面の投稿一覧から確認してください。
カテゴリIDとタグIDを確認する方法
カテゴリやタグを指定するには、名前ではなくIDを使います。
カテゴリ一覧は、次のURLで確認できます。
https://example.com/wp-json/wp/v2/categories
Pythonで確認するなら、次のコードを使います。
import os
import requests
site_url = os.environ["WP_SITE_URL"].rstrip("/")
endpoint = f"{site_url}/wp-json/wp/v2/categories"
response = requests.get(endpoint, timeout=30)
response.raise_for_status()
for category in response.json():
print(category["id"], category["name"], category["slug"])
タグの場合は、エンドポイントを次のように変更します。
https://example.com/wp-json/wp/v2/tags
記事作成時にタグを付けたい場合は、payload に次のように追加します。
payload = {
"title": "記事タイトル",
"status": "draft",
"content": "<p>本文です。</p>",
"categories": [10],
"tags": [23],
}
下書きを確認してから公開する
下書き作成後、管理画面で本文・見出し・カテゴリ・タグ・アイキャッチを確認します。
問題がなければ、WordPress管理画面から公開してもよいですし、REST APIから status を publish に変更することもできます。
import os
import requests
from requests.auth import HTTPBasicAuth
site_url = os.environ["WP_SITE_URL"].rstrip("/")
username = os.environ["WP_USERNAME"]
app_password = os.environ["WP_APP_PASSWORD"].replace(" ", "")
post_id = 123 # 公開したい記事IDに変更してください
endpoint = f"{site_url}/wp-json/wp/v2/posts/{post_id}"
payload = {
"status": "publish",
}
response = requests.post(
endpoint,
auth=HTTPBasicAuth(username, app_password),
json=payload,
timeout=30,
)
if response.status_code not in (200, 201):
print("公開処理に失敗しました")
print("status:", response.status_code)
print(response.text)
response.raise_for_status()
post = response.json()
print("公開しました:", post["link"])
ただし、実務では以下の順番がおすすめです。
- Pythonで
draft作成 - 管理画面で表示確認
- アイキャッチやメタ情報を確認
- 問題なければ公開
自動公開まで一気に行うのは、運用に慣れてからで十分です。
よくあるエラーと原因
REST APIまわりで止まりやすいエラーを整理します。

| エラー | よくある原因 | 次にやること |
|---|---|---|
401 rest_not_logged_in |
認証情報が届いていない、ユーザー名やApplication Passwordが違う | ユーザー名、Application Password、Authorizationヘッダーを確認する |
403 rest_cannot_create |
投稿権限がないユーザーで実行している | 管理者または投稿権限のあるユーザーで試す |
400 invalid_param |
status、カテゴリID、タグIDなどの指定が不正 |
レスポンス本文の params を確認する |
404 rest_no_route |
URLやエンドポイントが間違っている | /wp-json/wp/v2/posts のパスを確認する |
| SSLエラー | HTTPS設定や証明書の問題 | ブラウザでサイトがHTTPS表示できるか確認する |
私が最初に確認するのは、次の3つです。
https://example.com/wp-json/がブラウザで開けるか- ユーザー名とApplication Passwordが正しいか
statusをdraftにしているか
この3つで原因がかなり絞れます。
Authorizationヘッダーが届かない場合
環境によっては、Python側で正しく送っていても、サーバー側で Authorization ヘッダーがWordPressまで届かないことがあります。
この場合、401 rest_not_logged_in になりやすいです。
確認ポイントは次の通りです。
- セキュリティプラグインがREST API認証を制限していないか
- サーバーやWAFがAuthorizationヘッダーを削除していないか
.htaccessやサーバー設定でAuthorizationヘッダーをWordPressへ渡せているか
ここはレンタルサーバーの仕様差が出やすい部分です。
「ユーザー名もApplication Passwordも合っているのに401になる」場合は、コードよりサーバー設定側を疑いましょう。
実務で使うときの線引き
WordPress REST APIでの記事作成は、次のような作業に向いています。
- 自分の下書きメモをWordPressへまとめて投入する
- CSVやスプレッドシートから記事の骨組みを作る
- AIで作った構成案を下書きとして登録する
- 定型ページや検証記事のテンプレートを作る
一方で、次の使い方は慎重にしたほうがよいです。
- 内容確認なしで大量公開する
- 外部AIの出力をそのまま公開する
- 引用元や出典を確認せずに記事化する
- 1つのApplication Passwordを複数ツールで使い回す
自動化は便利ですが、公開物の責任まで自動化できるわけではありません。
まずは「下書き作成までを自動化する」と考えると、かなり安全に使えます。
まとめ
WordPress REST APIを使うと、Pythonから記事の下書きを作成できます。
ポイントは次の3つです。
- 投稿作成は
POST /wp-json/wp/v2/postsを使う - 認証にはApplication Passwordを使い、コードに直書きしない
- 最初は必ず
draftで作成し、管理画面で確認してから公開する
記事投稿の自動化は、いきなり完全自動公開を目指すより、下書き作成の時短から始めるのがおすすめです。
同じように「WordPressの記事投入を少しラクにしたい」と感じている方の助けになれば幸いです。
