WordPressに記事を自動投稿する構成(REST API + アプリケーションパスワード)

WordPressに記事を自動投稿する仕組みを、REST APIとアプリケーションパスワードで組んで運用しています。この記事では、実際に自分で構築して分かったこと——認証の作り方、アイキャッチ画像やカテゴリ・タグの扱い、そして初期投入で詰まったパーマリンクと.htaccessの問題——をまとめます。

投稿の入口は /wp-json/wp/v2/posts

WordPressの記事自動投稿は、REST APIのエンドポイント /wp-json/wp/v2/posts に投稿すれば実現できます。ここにタイトルや本文を送れば記事が作られる、というのが構成の中心です。逆に言うと、ここさえ叩ければ生成側が何であっても(スクリプトでもツールでも)自動化の形は作れます。

認証はアプリケーションパスワードを使う

認証には管理画面のログインパスワードを使いません。アプリケーションパスワードを発行して、それを使います。用途ごとに発行して分けられるので、自動投稿用の資格情報を管理画面のアカウント本体と切り離しておけるのが利点です。

wp-cliが使える環境なら、コマンド一発で発行できます。

wp user application-password create ユーザー名 用途名 --porcelain

--porcelain を付けると発行された値だけが返るので、そのまま環境変数なり設定ファイルなりに流し込めます。手作業でコピペする工程を挟まずに済むので、自動化前提ならこちらが素直です。

アイキャッチ画像は二段階になる

アイキャッチ画像は、記事の投稿と同時には送れません。先に /wp-json/wp/v2/media に画像をアップロードし、返ってきた media_id を記事側に渡す、という二段階の処理になります。

ここは自動化スクリプトを書くときに構造が変わるポイントです。「記事データを1回POSTすれば終わり」ではなく、

  • 画像を /wp-json/wp/v2/media にアップロードする
  • 返ってきた media_id を受け取る
  • その media_id を含めて /wp-json/wp/v2/posts に投稿する

という順序の依存が生まれます。画像アップロードが失敗したときに記事だけ投稿するのか、丸ごと中止するのか、といった扱いはあらかじめ決めておいたほうがよいです。

カテゴリとタグはIDでしか渡せない

カテゴリとタグは、文字列名をそのまま渡して済ませることができません。事前にIDを取得しておくか、存在しなければ作成した上で、そのIDを渡す必要があります。

つまり自動投稿の処理には「このカテゴリ名は既に存在するか?」を確認し、無ければ作る、という分岐が必ず入ります。記事本文を作るところより、この分類まわりの前処理のほうが地味に手間がかかりました。

初期投入はwp-cliのほうが早い

REST APIとは別に、wp-cliでも投稿できます。

wp post create ファイル名.html --post_title=...

HTMLファイルを直接指定して投稿できるので、既に記事が手元にまとまっている状態からの初期投入はこちらが圧倒的に早いです。REST API側の認証やスクリプトを整える前に、まず中身を入れてしまいたい、という段階ではwp-cliを使い、継続的な自動投稿はREST APIに寄せる、という使い分けをしています。

ハマったところ1:日本語タイトルとパーマリンク

パーマリンク設定を「記事名」にすると、日本語タイトルがそのままURLエンコードされます。結果として非常に長いURLになります。

対処としては、英語のスラッグを別途設定するのが良いです。自動投稿の構成を作る側から見ると、これは「タイトルを渡せば終わり」ではなく「英語スラッグも一緒に用意しなければならない」という要件が増えるということです。記事生成の段階でスラッグまで含めて作っておかないと、後から全記事を手で直すことになります。

ハマったところ2:.htaccessが無くて固定ページが404

wp core install 直後に、.htaccess が作られていないことがありました。この状態だと固定ページが404になります。原因が分からず最初はパーマリンク設定の問題かと思ったのですが、.htaccess を手で作れば直りました。

なぜ生成されないことがあるのか、どういう条件で起きるのかは、自分の環境で確認した範囲では分かっていません。分かっているのは「起きた」「手で作れば直った」という事実だけです。新規に立てたWordPressで固定ページが404になったら、まず .htaccess の有無を見るのが早い、という運用上の教訓として持っています。

まとめ

  • 自動投稿の入口は /wp-json/wp/v2/posts。認証はアプリケーションパスワードで、管理画面のログインパスワードは使わない
  • アプリケーションパスワードは wp user application-password create ユーザー名 用途名 --porcelain で発行できる
  • アイキャッチ画像は /wp-json/wp/v2/media にアップロードし、media_id を記事側に渡す二段階構成になる
  • カテゴリとタグはIDが必要。事前取得、無ければ作成という前処理が必ず入る
  • 手元にHTMLがある初期投入は wp post create ファイル名.html --post_title=... のほうが早い
  • パーマリンクを記事名にすると日本語タイトルがURLエンコードされて長大なURLになるので、英語スラッグを別途設定する
  • wp core install 直後に .htaccess が無く固定ページが404になることがある。手で作れば直るが、発生条件は分かっていない