- 実践 WordPress ホーム
- 開発者向け
- REST API
WordPress の REST API で投稿を作成する方法
WordPress の REST API を使って投稿(記事)を作成する方法を紹介します。
WordPress REST API とは?
WordPress REST API は WordPress 本体に備わった RESTful な API 機能です。
詳しくは次のページや WordPress の REST API Handbook でご確認ください。
WordPress の REST API で投稿を作成する方法
1. ユーザー認証の準備
WordPress の REST API で投稿を作るには、投稿作成権限を持つユーザーで認証を行う必要があります。
認証方法がいくつか用意されていますが、外部のスクリプトやコマンドから REST API を叩く場合は「アプリケーションパスワードを使った Basic 認証」がお手軽でかんたんです。 具体的な方法は別ページで解説しているのでそちらをご覧ください。
Note
https://
が無効な環境ではアプリケーションパスワードを使った Basic 認証は危険なので原則利用できません。
設定用の定数 WP_ENVIRONMENT_TYPE
を local
にセットすると使えるので、ローカル環境の場合はこの定数を wp-config.php
でセットしてください。
以降、 Basic 認証のためのアプリケーションパスワードを取得済みの前提でお話を進めます。
2. コマンドの実行
実際に REST API で投稿を作成するコマンドを実行します。 ここでは HTTPie と cURL コマンドを使います。
まずは Hello world な投稿を作成してみます。
HTTPie の場合:
http --auth='ユーザー名:アプリケーションパスワード' \
POST https://example.com/wp-json/wp/v2/posts/ \
title='Hello world' \
content='こんにちは'
cURL の場合:
curl -u 'admin:b4a8 kMAM zERN 0ELx jWFO iSlx' \
-X POST https://example.com/wp-json/wp/v2/posts/ \
-d 'title=Hello world 2' \
-d 'content=こんにちは'
投稿の作成に成功したらステータスコード 201 Created
でレスポンスが返されます。
ボディは作成された投稿の内容を含む JSON です。
デフォルトでは「下書き」状態で保存されます。
いろいろなパターン
投稿のタイトルと本文の他に、投稿の日付や slug などさまざまな要素をセットできます。
投稿日を指定 date
:
http --auth='ユーザー名:アプリケーションパスワード' \
POST https://example.com/wp-json/wp/v2/posts/ \
title='Hello world' \
content='こんにちは' \
date='2030-05-27T03:32:00'
slug を指定 slug
:
http --auth='ユーザー名:アプリケーションパスワード' \
POST https://example.com/wp-json/wp/v2/posts/ \
title='Hello world' \
content='こんにちは' \
slug='/hello'
下書きではなく直接公開する status
:
http --auth='ユーザー名:アプリケーションパスワード' \
POST https://example.com/wp-json/wp/v2/posts/ \
title='Hello world' \
content='こんにちは' \
status='publish'
その他に多くの入力項目が利用可能です。 詳しくは WordPress.org の REST API Handbook の Posts のページを参照ください。
3. スクリプトの作成と実行
動作確認・テストで利用するときはコマンドでもよいですが、繰り返し利用するような場合はスクリプトを書いた方が効率的です。
次のコードは Python の click
と httpx
を使ったスクリプトのサンプルです。
make_wordpress_post.py
:
# /// script
# dependencies = [
# "click~=8.1.7",
# "httpx~=0.27.2",
# ]
# ///
"""WordPress の REST API で投稿を作成する"""
import json
from typing import TextIO
import click
import httpx
BASE_URL = "https://example.com"
AUTH_USER = "..."
AUTH_PASS = "..."
@click.command()
@click.option("--title", required=True)
@click.argument("content", required=True, type=click.File("r"))
def main(title: str, content: TextIO):
payload = {
"title": title,
"content": content.read(),
}
response = httpx.post(
f"{BASE_URL}/wp-json/wp/v2/posts/",
data=json.dumps(payload),
headers={"Content-Type": "application/json"},
auth=(AUTH_USER, AUTH_PASS),
)
print(response.status_code)
print(response.json())
if __name__ == "__main__":
main()
このスクリプトは投稿のコンテンツをファイルパスで、タイトルをオプションで指定して使用できます。
コマンドの場合と同じく次のような感じでステータスコード 201 のレスポンスが返ってきたら作成は成功です。
投稿ではなく固定ページを作る方法
投稿ではなく固定ページを作りたいときは URL の末尾の posts
の部分を pages
に変えれば OK です。
http --auth='ユーザー名:アプリケーションパスワード' \
POST https://example.com/wp-json/wp/v2/pages/ \
title='Hello world' \
content='こんにちは'
コンテンツ入力の制限
なお、現状投稿のコンテンツの部分がきれいにブロック化された形で投稿するには、次のようにコードエディターの記法で HTML を記述する必要があります。
<!-- wp:heading -->
<h2 class="wp-block-heading">こんにちは</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>こんにちは</p>
<!-- /wp:paragraph -->
ブロックエディタを使わず完璧なコードエディターの記法でコンテンツを記述するのは少し大変です。 REST API で投稿したコンテンツを人力で管理画面でブロック化する方がかんたんかもしれません。
仮に markdown 形式で作成すると自動的にいい感じにブロック化されたりするとかなり使い勝手がよくなる気がします。 今後の開発に期待ですね。