ブログの更新を自動化したくて、WordPress REST APIを使った記事投稿の仕組みを作った。最終的にはcronジョブと組み合わせて、1日4回の自動投稿が回るようになった。その過程で何箇所かハマったので、まとめておく。
認証方式:アプリパスワードを使う
WordPress REST APIで記事を投稿するには認証が必要になる。いくつか方式があるが、一番手軽なのがアプリパスワードだった。WordPress管理画面の「ユーザー」→「プロフィール」の下部に「アプリケーションパスワード」というセクションがある。ここで名前をつけてパスワードを生成する。
生成されたパスワードはスペース区切りの文字列で表示される。最初、このスペースを除去して使おうとしたが、それだと認証が通らなかった。スペース区切りのまま使うのが正解だった。地味だがハマりポイント。
import base64, urllib.request, json
credentials = base64.b64encode(
b'username:xxxx xxxx xxxx xxxx xxxx xxxx'
).decode()
headers = {
'Content-Type': 'application/json',
'Authorization': f'Basic {credentials}'
}
記事を投稿する
/wp/v2/posts エンドポイントにPOSTリクエストを送れば記事が作成される。最低限必要なのはtitleとcontentだけだが、実用的にはslug、categories、statusも指定する。
post_data = {
'title': '記事タイトル',
'content': '<p>記事の本文</p>',
'status': 'publish',
'slug': 'article-slug',
'categories': [13]
}
data = json.dumps(post_data).encode()
req = urllib.request.Request(
'https://example.com/wp-json/wp/v2/posts',
data=data,
headers=headers
)
response = urllib.request.urlopen(req)
result = json.loads(response.read())
print(f"Post ID: {result['id']}")
statusをdraftにすれば下書き、publishにすれば即公開になる。最初は下書きで投稿して内容を確認してから公開する運用にしていたが、慣れてきてからは直接公開に切り替えた。
画像のアップロードとアイキャッチ設定
サムネイル画像を記事に設定するには、まず/wp/v2/mediaに画像をアップロードし、返ってきたメディアIDを記事のfeatured_mediaに設定する。
# 画像アップロード
with open('thumbnail.png', 'rb') as f:
img_data = f.read()
img_req = urllib.request.Request(
'https://example.com/wp-json/wp/v2/media',
data=img_data,
headers={
'Authorization': f'Basic {credentials}',
'Content-Type': 'image/png',
'Content-Disposition': 'attachment; filename="thumbnail.png"'
}
)
img_resp = urllib.request.urlopen(img_req)
media_id = json.loads(img_resp.read())['id']
Yoast SEOのフィールドをAPIから設定する
Yoast SEOプラグインを使っている場合、フォーカスキーフレーズやメタディスクリプションもAPI経由で設定できる。投稿のmetaフィールドに書き込む形になる。
meta_data = json.dumps({
'meta': {
'_yoast_wpseo_focuskw': 'フォーカスキーフレーズ',
'_yoast_wpseo_metadesc': 'メタディスクリプション(80文字以内)'
}
}).encode()
これで投稿時にSEO設定も一括で済む。手動で管理画面を開いて設定する手間がなくなった。
cronジョブとの組み合わせ
記事生成とAPI投稿をひとつのスクリプトにまとめ、cronで定期実行している。1日4回、6時間おきに起動する。1回のジョブで新規記事の作成とリライト(既存記事の更新)を両方処理する。
新規記事はトレンドキーワードをベースに生成し、リライトは古い記事の内容を最新情報で更新する。どちらも同じエンドポイントで処理できる。新規はPOST、更新は既存記事のIDを指定してPOST。
運用してみて
この仕組みが安定して動くようになってから、ブログの更新頻度を気にする必要がなくなった。記事のクオリティチェックは別途行っているが、投稿作業自体は完全に自動化できている。
WordPress REST APIは思っていたより扱いやすかった。認証まわりのドキュメントが少しわかりにくいが、アプリパスワード方式ならそこまで苦労しないと思う。