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

WordPress に記事をプログラムから投稿する構成を、実際に組んで運用しています。REST API とアプリケーションパスワードの組み合わせ、アイキャッチ・カテゴリの扱い、そして最初にハマった 404 とURLの問題までをまとめます。

構成の骨格は「REST API に POST するだけ」

WordPress には /wp-json/wp/v2/posts というエンドポイントがあり、ここに投稿すれば記事の作成を自動化できます。管理画面を開いてエディタに貼り付ける作業は、原理的には全部これで置き換えられます。

やることは「認証を通す」「本文を投げる」「画像とタクソノミーのIDを添える」の3つだけで、構成としてはとてもシンプルです。ただし、この3つそれぞれに小さな段差があります。

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

まず大前提として、管理画面のログインパスワードは使いません。REST API 用に発行するアプリケーションパスワードを使います。

注意

自動化スクリプトに管理画面のログイン情報を書くのは避けてください。スクリプトが漏れた時点で、そのアカウント全体が奪われます。用途ごとにアプリケーションパスワードを分けておけば、怪しくなったものだけを止められます。

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

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

--porcelain を付けると生成されたパスワードだけが出力されるので、そのまま環境変数や設定ファイルに流し込めます。用途名を分かるものにしておくと、後から「これはどのスクリプト用だったか」を追えます。

アイキャッチは先にアップロードしてIDを渡す

記事本文と一緒に画像ファイルを投げる、という形にはなっていません。手順は2段階です。

  1. /wp-json/wp/v2/media に画像をアップロードする
  2. 返ってきた media_id を、記事側に渡す

アイキャッチは「メディアを作ってから記事を作る」順番が固定だと理解しておくと、スクリプトの流れを組みやすくなります。逆に言うと、記事作成とメディアアップロードでリクエストが最低2回必要になります。

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

ここが自動投稿で一番めんどうな部分でした。カテゴリもタグも、名前の文字列ではなくIDを渡す必要があります。

つまりスクリプト側で、

  • 指定されたカテゴリ名/タグ名のIDを取得する
  • 無ければ作成して、そのIDを受け取る

という処理を先に通してから、記事のリクエストを組み立てることになります。「タグは記事投稿と同時に勝手に作られる」と思い込んでいると確実に詰まるので、ここは最初に作り込んでおくのがおすすめです。

ポイント

REST API 経由の1記事投稿は、実際には「メディア」「カテゴリ」「タグ」「記事本体」の複数リクエストの組み合わせになります。単発のPOSTで完結する、という前提で設計すると後から作り直しになります。

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

既存の記事をまとめて入れる、といった初期投入の場面では、REST API より wp-cli のほうが手っ取り早いです。

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

HTMLファイルをそのまま渡せるので、認証まわりの実装を待たずに投入を始められます。

用途 向いている方法
既存記事の一括初期投入 wp-cli の wp post create
継続的な自動投稿 REST API + アプリケーションパスワード
うまくいったこと

「初期投入は wp-cli、運用は REST API」と割り切ったことで、API実装が終わる前に記事の投入を進められました。両方を無理にひとつのスクリプトに統一しなくてよかったと思っています。

つまずいた2つの落とし穴

1. 日本語タイトルのURLが異常に長くなる

パーマリンク設定を「記事名」にすると、日本語タイトルがそのままURLエンコードされて、非常に長いURLになります。自動投稿だとタイトルをそのまま流し込むので、これが全記事で起きます。

対策は、記事ごとに英語のスラッグを別途設定すること。タイトル任せにしないで、スラッグを明示的に持たせる設計にしておくべきでした。

失敗したこと

スラッグを指定しないまま投稿を回して、エンコード済みの長大なURLの記事を量産してしまいました。後からURLを変えると当然リンクが変わるので、最初からスラッグを必須項目にしておくのが正解です。

2. .htaccess が無くて固定ページが404

wp core install の直後に .htaccess が作られないことがあり、そのままだと固定ページが404になります。これは手で .htaccess を作れば直りました。

REST API の実装を疑って時間を溶かしがちなところですが、固定ページが軒並み404なら、まず .htaccess の有無を見ると早いです。

分かっていないこと

正直に書いておきます。

  • アプリケーションパスワードをどのくらいの頻度で作り直すべきか、運用ルールは決めきれていません
  • .htaccess が作られないケースの発生条件は、こちらでは特定できていません。手で作れば直る、というところまでしか分かっていません
まとめ

  • 自動投稿は /wp-json/wp/v2/posts への POST が基本。認証はアプリケーションパスワードで、ログインパスワードは使わない
  • 発行は wp user application-password create ユーザー名 用途名 --porcelain が速い
  • アイキャッチは /wp-json/wp/v2/media に先にアップロードして media_id を渡す
  • カテゴリ・タグはIDが必要。無ければ作成してからIDを渡す処理を先に作る
  • 初期投入は wp post create ファイル名.html --post_title=... のほうが早い
  • パーマリンク「記事名」+日本語タイトルは長大なURLになるので、英語スラッグを別途設定する
  • wp core install 直後は .htaccess が無くて固定ページが404になることがある。手で作れば直る