REST APIを使用してWordPressに記事を投稿する方法

  • URLをコピーしました!

当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますので、予めご了承ください。

この記事では、Pythonを使用してWordPressのREST APIを操作し、投稿を自動作成する方法を解説します。

WordPress環境
  • WordPressバージョン:6.7.1
  • SWELLバージョン: 2.13.0
  • PHPバージョン: 8.2.22

バージョンが異なると本記事の内容が正常に動作しない可能性があります。また、プラグインの影響や、function.phpや.htaccess等への記述、JavaScript等の影響も受ける可能性があります。

目次

この記事で使用するPythonライブラリ

この記事では以下のPythonライブラリを使用します。

ライブラリ用途ライセンス
requestsHTTPリクエストApache 2.0
datetime日時の取得Python標準モジュール

REST APIとは?

REST API(Representational State Transfer Application Programming Interface) は、ソフトウェアやアプリケーション間でデータをやり取りするための仕組みです。Webサービスやアプリケーションを外部システムから操作・管理する際に利用します。

RESTの基本原則

RESTは、HTTPプロトコルを基盤にしたアーキテクチャスタイルであり、次の原則に従います:

  1. リソース(Resource)
    • データや情報(例:記事、ユーザー、画像)を「リソース」として定義します。
      • WordPressの「投稿」は posts リソースです。
  2. リソースの識別
    • 各リソースには一意の識別子(URL)が割り当てられます。
      • すべての投稿: https://example.com/wp-json/wp/v2/posts
      • 特定の投稿(ID:1): https://example.com/wp-json/wp/v2/posts/1
  3. HTTPメソッド
    • リソースの操作にはHTTPの標準メソッドを使用します。
      • GET: データの取得
      • POST: 新規データの作成
      • PUT/PATCH: データの更新
      • DELETE: データの削除
  4. ステートレス(Stateless)
    • 各リクエストは独立しており、サーバー側はリクエストごとに必要な情報を保持します。
  5. JSONやXML形式のデータ
    • データの送受信にはJSONXML形式が一般的です。
    • JSON: 軽量で人間と機械が理解しやすい形式。

WordPress REST APIの例

WordPressはREST APIを提供しており、外部から記事やページを操作できます。

処理内容HTTPメソッドURL
投稿一覧の取得GET/wp-json/wp/v2/posts
投稿ID:1取得GET/wp-json/wp/v2/posts/1
新規投稿の作成POST/wp-json/wp/v2/posts
投稿ID:1の更新PUT/wp-json/wp/v2/posts/1
投稿ID:1の削除DELETE/wp-json/wp/v2/posts/1
エンドポイントの例

REST APIを使用してWordPressに記事を投稿する方法

アプリケーションパスワードの設定

Wordfenceなどのセキュリティ系プラグインによりアプリケーションパスワードが無効化されている場合があります。無効化を解除してから設定してください。

管理者権限のあるアカウントでログインし、WordPress管理画面左カラムの「ユーザー」→「プロフィール」をクリックします。

WordPress管理画面左カラムの「ユーザー」→「プロフィール」をクリック
WordPress管理画面左カラムの「ユーザー」→「プロフィール」をクリック

「新しいアプリケーションパスワード名」に任意の名前を記入し、「新しいアプリケーションパスワードを追加」をクリックします。

アプリケーションパスワードが表示されるので、メモを取ります。(パスワードを忘れた場合、再取得はできません。)

コーディング例

以下に、Pythonスクリプトを使用してWordPressサイトに投稿を作成するコード例を示します。

  • 設定
    • WP_URL: WordPress REST APIのエンドポイントURL。(トップページのURL+"/wp-json/wp/v2")
    • USERNAME: WordPressにログインする際に使用するユーザー名(アプリケーションパスワード名ではありません)。
    • PASSWORD: REST APIにアクセスするためのアプリケーションパスワード。
    • featured_image_url: 投稿のアイキャッチ画像URL。
  • 関数
    • get_existing_image_id: アイキャッチ画像がすでにWordPressにアップロードされているか確認し、メディアIDを取得する。
    • upload_image: 画像がアップロードされていない場合、新しい画像をWordPressにアップロードする。
    • create_post: 新しい投稿を作成する。投稿には以下のデータが含まれる。
      • タイトル
      • 投稿内容
      • スラッグ(URLパス)
      • 投稿ステータス
        • 下書き: draft
        • 公開: publish
      • 投稿日時: ISO 8601形式で記述。
        • フォーマット: YYYY-MM-DDTHH:MM:SS(例: 2024-12-18T10:55:00
          • 日付と時刻の間に T を挿入
          • タイムゾーンを指定する場合(例: UTC+9): 2024-12-18T10:55:00+09:00
      • カテゴリーとタグ(IDで指定)
      • カスタムフィールド
        • WordPress REST API経由でカスタムフィールドを正常に操作するには、function.phpにregister_post_meta を記述してカスタムフィールドを登録し、REST APIで使用できるようにします。
      • アイキャッチ画像(画像IDがある場合)
  • 実行
    • create_post関数を呼び出して投稿を作成する。
import requests
from requests.auth import HTTPBasicAuth
from datetime import datetime

# WordPress設定
WP_URL = "https://example.com/wp-json/wp/v2" # WordPress REST APIのエンドポイント
POSTS_URL = f"{WP_URL}/posts"
MEDIA_URL = f"{WP_URL}/media"
USERNAME = "your_login_name"  # WordPressにログインする際に使用するユーザー名を設定
PASSWORD = "your_application_password"  # Application Passwordを設定

# アイキャッチ画像のURL
featured_image_url = "eyecatch_URL" #WordPressにアップロード済みのメディアのURL

# 既存のアイキャッチ画像のメディアIDを取得
def get_existing_image_id(image_url):
    file_name = image_url.split("/")[-1]
    response = requests.get(f"{MEDIA_URL}?search={file_name}", auth=(USERNAME, PASSWORD))
    if response.status_code == 200:
        media_items = response.json()
        for media in media_items:
            if media.get('source_url') == image_url:  # 完全一致確認
                return media['id']
    return None

# アイキャッチ画像のアップロード
def upload_image(image_url):
    image_name = image_url.split("/")[-1]
    response = requests.get(image_url, stream=True)
    if response.status_code == 200:
        files = {'file': (image_name, response.raw, 'image/jpeg')}
        headers = {'Content-Disposition': f'attachment; filename={image_name}'}
        res = requests.post(MEDIA_URL, files=files, headers=headers, auth=(USERNAME, PASSWORD))
        if res.status_code == 201:
            return res.json()['id']  # 画像のIDを返す
        else:
            print(f"画像アップロード失敗: {res.status_code}, {res.text}")
    else:
        print(f"画像の取得失敗: {image_url}")
    return None

# 投稿作成
def create_post():
    # 既存のアイキャッチ画像IDを取得
    image_id = get_existing_image_id(featured_image_url)
    if not image_id:  # 画像が未アップロードの場合のみアップロード
        print("画像がアップロードされていないため、アップロードを実行します。")
        image_id = upload_image(featured_image_url)
    else:
        print(f"既存の画像を使用します (ID: {image_id})")

    # 投稿データ
    data = {
        "title": "テスト投稿",                   # 投稿タイトル
        "content": "テスト内容",                 # 投稿内容
        "slug": "test",                         # スラッグ
        "status": "draft",                      # 投稿ステータス (下書き)
        "date": datetime.now().isoformat(),     # 投稿日時 (現在時刻)
        "categories": [5, 14],                  # カテゴリーID
        "tags": [17, 25],                       # タグID
        "meta": {                               # カスタムフィールド"test"に"10"を設定
            "test": "10"
        }
    }

    if image_id:  # アイキャッチ画像を設定
        data["featured_media"] = image_id

    # WordPressに投稿
    response = requests.post(POSTS_URL, json=data, auth=HTTPBasicAuth(USERNAME, PASSWORD))
    if response.status_code == 201:
        print(f"投稿成功: {response.json()['title']['rendered']}")
    else:
        print(f"投稿失敗: {response.status_code}, {response.text}")

# 投稿作成を実行
create_post()
// REST APIでカスタムフィールドを登録
function register_custom_post_meta() {
    // "test" フィールドを登録
    register_post_meta('post', 'test', array(
        'type' => 'string',            // データ型
        'single' => true,              // 単一値か
        'show_in_rest' => true,        // REST APIで表示・編集可能
        'sanitize_callback' => 'sanitize_text_field', // サニタイズ処理
        'auth_callback' => function() { // 権限チェック
            return current_user_can('edit_posts');
        },
    ));
}
add_action('init', 'register_custom_post_meta');

まとめ

本記事を通じて、PythonとWordPress REST APIを組み合わせて投稿を自動化する手法が理解できたはずです。アイキャッチ画像の扱いやカスタムフィールドの登録など、実際の運用に即した内容もカバーしています。

この技術を応用すれば、効率的なサイト運営が可能になります。環境設定やREST APIの基本原則をしっかり理解し、より高度なカスタマイズにも挑戦してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
目次