MENU

【コピペOK】WordPress REST APIで記事を自動投稿する方法|Pythonで安全に下書き作成

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

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 を使います。

WordPress REST APIでPythonから下書きを作成し公開確認する流れ
PythonからREST APIを通じてWordPress下書きを作成し、管理画面で確認して公開する流れ。

ざっくり整理すると、次のようなイメージです。

やりたいこと メソッド エンドポイント
記事一覧を取得する 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管理画面で、以下の順に進みます。

  1. WordPress管理画面にログイン
  2. ユーザー → プロフィールを開く
  3. Application Passwordsの欄を探す
  4. 分かりやすい名前を付ける
  5. 生成されたパスワードをコピーする

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です。

Application Passwordを環境変数から読み込む安全な認証フロー
Application Passwordはコードに直書きせず、環境変数から読み込むのが基本です。

〖コピペOK〗Pythonで下書き記事を作成する

以下のコードを create_wp_draft.py という名前で保存して実行します。

最初は必ず statusdraft にしておきましょう。

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から statuspublish に変更することもできます。

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"])

ただし、実務では以下の順番がおすすめです。

  1. Pythonで draft 作成
  2. 管理画面で表示確認
  3. アイキャッチやメタ情報を確認
  4. 問題なければ公開

自動公開まで一気に行うのは、運用に慣れてからで十分です。

よくあるエラーと原因

REST APIまわりで止まりやすいエラーを整理します。

WordPress REST APIの401 403 400エラー切り分け図
401、403、400のステータスコードごとに、最初に確認する場所を整理した図。
エラー よくある原因 次にやること
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が正しいか
  • statusdraft にしているか

この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の記事投入を少しラクにしたい」と感じている方の助けになれば幸いです。

この記事を書いた人

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

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

目次