Python × WordPress REST API:記事投稿を完全自動化する実践ガイド

システムエンジニアとして26年、効率化を追求してきた私が辿り着いた、WordPressへの自動投稿の実装手順を詳細に解説します。

手動での投稿作業を自動化し、解析プログラムからダイレクトに記事を公開できる環境を構築しましょう。


1. 事前準備:WordPress側の設定

APIを利用するためには、通常のログインパスワードではなく「アプリケーションパスワード」が必要です。

① アプリケーションパスワードの発行

  1. WordPress管理画面の「ユーザー」→「プロフィール」を開きます。
  2. ページ下部の「新しいアプリケーションパスワード名」に「Python-Auto-Post」などの任意の名前を入力。
  3. 「新しいアプリケーションパスワードを追加」をクリック。
  4. 一度だけ表示されるパスワード(4文字×4つの形式)を必ずメモしてください。

② カテゴリーIDとメディアIDの確認

コード内で指定するIDを確認します。

  • カテゴリーID: 「投稿」→「カテゴリー」の一覧で、各カテゴリー名の上にマウスを置くと、ブラウザ下部のURLに tag_ID=13 のように表示されます。
  • メディア(アイキャッチ)ID: 「メディア」→「ライブラリ」で画像をクリックした際のURLに含まれる item=177 という数字がIDです。事前にアイキャッチ用の画像をアップロードしておくとスムーズです。

2. 実装コード(Python)

セキュリティを考慮し、パスワードなどの機密情報は .env ファイルに切り出します。

.env ファイルの作成

WORDPRESS_USER=あなたのログインID
WORDPRESS_PASSWD=先ほど取得した16文字のパスワード

自動投稿スクリプト

requests ライブラリを使用して、REST APIのエンドポイントを叩きます。

Python

import requests
import json
from requests.auth import HTTPBasicAuth
import os
from dotenv import load_dotenv

load_dotenv()
# --- 設定情報 ---
SITE_URL = "https://keiba-toushi.org"  # 自分のサイトURL
USER_NAME = os.getenv('WORDPRESS_USER')           # ログインユーザー名
APP_PASSWORD = os.getenv('WORDPRESS_PASSWD')  # 先ほど発行したパスワード

# エンドポイント
endpoint = f"{SITE_URL}/wp-json/wp/v2/posts"

def wordpress_post_api_call(title, content, status = "publish", categories = [13],image_id=177):
    # 投稿内容
    post_data = {
        "title": title,
        "content": content,
        "status": status,  # 'publish'(公開) または 'draft'(下書き)
        "categories": categories,    # カテゴリID(管理画面で確認可能)
        "featured_media": image_id  # ここで画像IDを指定!
    }

    # 実行
    response = requests.post(
        endpoint,
        data=json.dumps(post_data),
        headers={'Content-Type': 'application/json'},
        auth=HTTPBasicAuth(USER_NAME, APP_PASSWORD)
    )
    print(f"DEBUG: User={USER_NAME}, Pass={APP_PASSWORD}, Endpoint={endpoint}")
    print(f"DEBUG: Post Data={post_data}")
    print(f"DEBUG: Response={response.text}")

    # 結果確認
    if response.status_code == 201:
        print("投稿に成功しました!")
    else:
        print(f"エラーが発生しました: {response.status_code}")
        print(response.text)

if __name__ == "__main__":
    
    wordpress_post_api_call("test","test")

3. 重要:通信エラー(401/403)への対策

API経由の投稿は、サーバーのセキュリティ設定に阻まれるケースが多々あります。動かない場合は以下をチェックしてください。

① レンタルサーバーの制限

エックスサーバーやConoHa WINGなどでは、セキュリティ設定に「REST APIアクセス制限」がある場合があります。これをOFFにする必要があります。

② セキュリティプラグイン(SiteGuardなど)

「SiteGuard WP Plugin」を導入している場合、デフォルトでREST APIがブロックされていることがあります。プラグイン設定から「REST API無効化」を解除してください。

③ .htaccess の修正(Authorizationヘッダーの継承)

ここが最大の落とし穴です。多くのサーバーでは、セキュリティ上の理由で認証ヘッダー(Authorization)がPHPに引き渡されない設定になっています。 その場合、サーバーの .htaccess ファイルの先頭に以下の3行を追加してください。

Apache

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

これを追加することで、Pythonからの認証情報が正しくWordPressに届くようになります。


4. まとめ

WordPress REST APIを活用すれば、Pythonで解析したデータをそのまま読者に届ける強力なパイプラインが完成します。 一度環境を構築してしまえば、あとはロジックの改善に集中できるのが最大のメリットです。

自動化によって生まれた時間を、さらなる予測精度の向上に充てていきましょう。

クリックしていただけると記事を書くモチベーションになります!