以前から、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メソッドを発行することで行います。
ただし、更新系の処理には認証が必要で、認証の方法によって、プラグインをインストールする必要があります。
- Cookie認証・・・特にプラグインは必要ないが、一度Wordpressへのログインが必要
- OAuth認証・・・「WordPress REST API – OAuth 1.0a Server」プラグインを使用
- パスワード認証・・・「Application Passwords」プラグインを使用
このうち、今回は、パスワード認証を使うことにします。
本番環境ではOAuth認証を使うことが推奨されていますので、それはまた、別の記事でご紹介したいと思います。
はじめに「Application Passwords」プラグインをWordpressにインストールし、有効化します。
次にAPI認証用のパスワードを発行します。
※管理コンソールのログインに使うパスワードとは別にAPI認証専用のパスワードが必要になります。
「Application Passwords」プラグインを有効化すると、管理画面(ダッシュボード)のユーザー編集画面の下の部分に、以下のようにAPI認証用のパスワードを追加する表示が現れます。
ここで、適当に名前をつけて「Add New」ボタンを押すと、パスワードが発行されます。
こんな画面が表示されます。
パスワードが発行されたのですが、それをそのまま認証に利用するわけではありません。
実際に投稿のリクエストを行うには、ユーザ名と認証パスワードを「:」(コロン)で連結し、それを 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==
といった感じです。
それでは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での投稿に失敗する場合
環境によってはエラーが表示されて投稿できない場合があります。
私が遭遇したエラーは以下のようなものでした。
「Application Passwords」プラグインを有効化して、ユーザ編集画面の下部に以下のようなエラーが表示されていることがあります。
Authorizationヘッダが禁止されているために表示されるもので、この状態のまま投稿のリクエストを送ると、Authorizationヘッダが除外されるので、「401エラー」になります。
この場合は、「.htaccess」ファイルに
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
を追加します。
レンタルサーバを使っていると、WAFやサーバ自体の設定で、海外のIPアドレスからのREST更新が禁止されていることがあります。
この場合、多くは403エラーとなります。
Xserverの場合は、海外からのAPI更新を禁止していたので、それを解除する必要がありました。