はじめに
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', '<シークレットキー>');