WordPressのREST APIで記事情報の取得や投稿を行う方法

以前から、WordpressでのREST APIの提供は行われていました。

WordPressのVer4.6以前は標準ではなかったため、プラグインをインストールする必要がありましたが。Ver4.7より標準実装になり、特にプラグインを入れなくても、RESTを使えるようになっています。

(Ver4.7以降はWordPressのインストールだけでREST-API自体は使え、投稿情報を取得することなどもできますが、記事を投稿するなどの更新系の処理を行うには認証が必要で、その認証の仕組みを提供するのに、認証の種類に応じたプラグインが必要となっています。後述します。)

WordPressはブログCMSのメジャーとしての地位を確立していて、Wordpressと他のシステムを連携させたいというニーズは、今後もどんどん増えてくるでしょう。

そうなると、RESTなど、APIを使った連携も視野に入ってきますよね。

この記事では、RESTを使ってWordpressの情報を取得したり、記事を投稿したりする方法について解説します。

REST APIでWordpressの各種情報を取得する

はじめに、標準の機能で、投稿記事などの情報を取得してみましょう。

どのようなREST APIがあるのかは、公式のAPIリファレンスページに載っています。

投稿の情報を取得するには対象ドメイン+/wp-json/wp/v2/postsをGETメソッドで取得します。

いくつか例を見てみましょう。

投稿の一覧を取得する

https://www.yourdomain.com/wp-json/wp/v2/posts

投稿Idが2の投稿を取得する

https://www.yourdomain.com/wp-json/wp/v2/posts/2

Ver4.7以前はfilterというパラメータが使用でき、以下のように取得できましたが、セキュリティ上の理由で、Ver4.7以降では使用できなくなっています

https://www.yourdomain.com/wp-json/wp/v2/posts?filter[s]=hello

今後は以下のように、カテゴリなどで絞って、searchオプションを使うといいかもしれません。(searchというエントリポイントもありますが、いまいち使いにくい。。)

https://www.yourdomain.com/wp-json/wp/v2/posts?categories=1&per_page=30&order=asc&search=あああ

REST APIで記事の投稿や更新を行う

次に、新規に記事を投稿してみます。

投稿は対象ドメイン+/wp-json/wp/v2/postsに対してPOSTメソッドを発行することで行います。

ただし、更新系の処理には認証が必要で、認証の方法によって、プラグインをインストールする必要があります。

認証の種類と必要なプラグイン

このうち、今回は、パスワード認証を使うことにします。

本番環境ではOAuth認証を使うことが推奨されていますので、それはまた、別の記事でご紹介したいと思います。

プラグインのインストールとセットアップ

プラグインのインストール

はじめに「Application Passwords」プラグインをWordpressにインストールし、有効化します。

認証用パスワードの発行

次にAPI認証用のパスワードを発行します。

※管理コンソールのログインに使うパスワードとは別にAPI認証専用のパスワードが必要になります。

「Application Passwords」プラグインを有効化すると、管理画面(ダッシュボード)のユーザー編集画面の下の部分に、以下のようにAPI認証用のパスワードを追加する表示が現れます。

ここで、適当に名前をつけて「Add New」ボタンを押すと、パスワードが発行されます。

こんな画面が表示されます。

Base64化したパスワードの準備

パスワードが発行されたのですが、それをそのまま認証に利用するわけではありません。

実際に投稿のリクエストを行うには、ユーザ名と認証パスワードを「:」(コロン)で連結し、それを Base64化した文字列をヘッダに埋め込んで使います。

例えば、ユーザ名が「usera」で、上記で発行されたパスワードが「zxx1 DEtS 3xxP wxxg qxxe mxxF」だったとしたら、

「usera:zxx1 DEtS 3xxP wxxg qxxe mxxF」をBase64化します。

コマンドでやるとしたら、

echo -n “usera:zxx1 DEtS 3xxP wxxg qxxe mxxF” | base64

b78jvWf1dnIwIENFdFLlPlk0KiDrY2ldIEFObnSgbU8yRr==

といった感じです。

POSTを使った記事投稿

それではBase64化したユーザ名と認証パスワードを使って投稿を行いましょう。

ヘッダーへは 「Authorization: Basic xxxxxx 」のように追加します。

curlを利用して投稿すると以下のようになります。「Sample title」というタイトルで下書き状態で投稿されます。

curl --header "Authorization: Basic b78jvWf1dnIwIENFdFLlPlk0KiDrY2ldIEFObnSgbU8yRr==" \
       -X POST -d "title=Sample title" https://www.yourdomain.com/wp-json/wp/v2/posts

上記はタイトルだけをセットしていますが、記事の中身などもセットするには、JSON形式を使い、ヘッダーに、Content-Type: Application/jsonを追加します。

以下の例は、記事の中身も含めて、公開状態で投稿されます。

curl -X POST --header "Authorization: Basic b78jvWf1dnIwIENFdFLlPlk0KiDrY2ldIEFObnSgbU8yRr==" \
       -H "Content-Type: Application/json" \
       -d '{"title":"Sample title2","content":"2222","status":"publish"}' \
       https://www.yourdomain.com/wp-json/wp/v2/posts

エラーでREST APIでの投稿に失敗する場合

環境によってはエラーが表示されて投稿できない場合があります。

私が遭遇したエラーは以下のようなものでした。

Authorizationヘッダが禁止されている場合

「Application Passwords」プラグインを有効化して、ユーザ編集画面の下部に以下のようなエラーが表示されていることがあります。

Authorizationヘッダが禁止されているために表示されるもので、この状態のまま投稿のリクエストを送ると、Authorizationヘッダが除外されるので、「401エラー」になります。

この場合は、「.htaccess」ファイルに

RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]

を追加します。

海外からのREST APIが禁止されている場合

レンタルサーバを使っていると、WAFやサーバ自体の設定で、海外のIPアドレスからのREST更新が禁止されていることがあります。

この場合、多くは403エラーとなります。

Xserverの場合は、海外からのAPI更新を禁止していたので、それを解除する必要がありました。