WP REST API v2を使ってみた

はじめに

WP REST API v2を使うと、外部アプリケーションから
wordpressに記事や固定ページを作成したり、編集、削除できます。

ちなみに、作成や編集、削除には認証が必要になりますが、
閲覧だけなら認証する必要はないようです。

http://<Wordpressサイト>/wp-json/wp/v2/posts

上記URLにアクセスしてみると、投稿のリストがjson形式で返されます。

WP REST APIについて

WP REST APIを使うために、
今まではプラグインを導入する必要がありましたが、
wordpress 4.7からは最初から組み込まれていますので、
特にプラグインをインストールする必要はないようです。

認証について

wordpressの記事や固定ページをWP REST API v2から
作成・編集・削除しようとした場合、
認証が必要になるようです。

  • クッキー認証
  • OAuth認証
  • Basic認証

認証の方法は上記の種類があります。
詳しくは公式ドキュメントの認証をご確認ください 🙂

OAuth認証プラグインの導入

OAuth認証を提供してくれるPluginを導入します。

上記プラグインをwordpressにインストールしてください。
ここからいくつか、手動で作業する必要があります。

.htaccessの編集

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
</IfModule>

.htaccessをエディタで開き、上記内容を追記します。
できるだけ行頭あたりに書くことが好ましいようです。

wp-config.phpの編集

次に、このプラグイン用のシークレットキーを、
wp-config.phpに追記します。
シークレットキーの生成はwordpressの秘密鍵サービスを
利用するのが楽かと思います。
https://api.wordpress.org/secret-key/1.1/salt/

define('JWT_AUTH_SECRET_KEY', '<シークレットキー>');

上記のように、wp-config.phpにJWT_AUTH_SECRET_KEYとして、
生成された秘密鍵の文字列を追記します。

この秘密鍵もできるだけ行頭あたりに書くことをおすすめします。

認証する方法

導入したOAuth認証プラグインを利用するには、
認証エンドポイントへユーザ名とパスワードを渡す必要があります。

http://<wordpressサイト>/wp-json/jwt-auth/v1/token

上記URLへユーザ名とパスワードをPOSTすると、
認証用のトークンがJSON形式で返されます。

記事や固定ページを作成・編集・削除するには、
返された認証用トークンを使用します。

使用例

試しにcurlコマンドで投稿してみましょう。

OAuth認証をする

curl -F 'username=<ユーザー名>' -F 'password=<パスワード>' http://<wordpressサイト>/wp-json/jwt-auth/v1/token

上記コマンドを叩くと、
OAuth認証をしたユーザーのトークンが発行されます。

{"token":"<ユーザーのトークン>","user_email":"<ユーザーのメールアドレス>","user_nicename":"ユーザー名","user_display_name":"表示されているユーザの名前"}

上記のようなjsonが返されるかと思います。
投稿にはユーザーのトークンを使用します。

投稿する

先ほど取得したユーザーのトークンをAuthorizationヘッダーで渡し、
記事の内容は指定されているパラメータでPOSTします。

curl -H "Authorization: Bearer <ユーザーのトークン>" http://<wordpressサイト>/wp-json/wp/v2/posts -F 'title=<タイトル>' -F 'content=<本文>'

ここではtitleとcontentのみをPOSTしましたが、
送信できるパラメータは多くあります。
詳しくは投稿のAPIリファレンスを参照してください 🙂

おまけ

投稿できるようになるまで、いくつか躓いた箇所があったので
メモしておきます。

code:rest_cannot_create

OAuth認証に成功して、記事を書こうとした時に
発生したエラーです。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
</IfModule>

上記内容が.htaccessの正しい位置に書かれていなかったことが
原因のようです。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

上記のwordpressの設定より前に書いたところ、
無事解決しました。

code:jwt_auth_bad_config

JWT_AUTH_SECRET_KEYの定義位置が、
正しい位置ではなかったため発生したエラーです。

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

上記コード部分のwp-settings.phpが読み込まれる前に、
下記のJWT_AUTH_SECRET_KEYを定義したところ、
無事解決しました。

define('JWT_AUTH_SECRET_KEY', '<シークレットキー>');

 


投稿日

カテゴリー:

投稿者:

タグ: