WordPress REST APIを利用した投稿の取得と新規投稿と、Advanced Custom Fields (以下 ACF) を利用したカスタムフィールドの所得・更新を行ってみました。
今回検証に使用した環境は以下になります。
- PHP 5.6
- WordPress 4.5.3
- Advanced Custom Fields 4.4.7
- WordPress REST API (Version 2) 2.0-beta13.1
- Application Passwords 0.1-dev
- ACF to REST API 2.2.0
注意
公式のページにもあります通り、WP REST APIはまだベータ版となりますので使用には十分注意して下さい。
重要: ベータ1は、将来のバージョンで互換性が保障されているわけではありません。公にテストを行うには十分な信頼性があると考えていますが、さらに改善するために互換性がなくなるかもしれません。バージョン2は、本番環境では使用しないで開発環境においてのみ使用してください。
http://ja.wp-api.org/changes-beta-1.html
WP REST API
インストール
プラグインのインストール画面から、「WordPress REST API」などと検索し、インストール・有効化を行って下さい。
WordPress REST API (Version 2) — WordPress Plugins
投稿の取得
有効化を行っただけでAPIのエンドポイントが提供されます。
投稿の取得は以下のエンドポイントで取得できます。
/wp-json/wp/v2/posts
その他の項目の取得などは公式リファレンスを参考にして下さい。
APIリファレンス | WP REST API v2 Documentation
カスタムフィールド
ACF to REST API
カスタムフィールドは、ACFを利用することにします。
WP REST APIのプラグインを導入しただけではACFで追加したカスタムフィールドは取得出来ません。
これを取得するために、ACF to REST API
というプラグインを導入します。
ACF to REST API — WordPress Plugins
こちらもインストールして有効化した時点で、ACF用のエンドポイントが作られます。
以下の様にカスタムフィールドを追加したとします。
- 追加テキスト -
text_item
- 追加フラグ -
bool_item
IDが1
の投稿のカスタムフィールドを取得するには以下のエンドポイントへアクセスします。
/wp-json/acf/v2/post/1
すると、以下のようにACFで追加された項目のみ返却されます。
{
acf: {
text_item: "追加したテキストの内容",
bool_item: true
}
}
各エンドポイントは、プラグインのGithubに詳細がありますので参考にして下さい。
airesvsg/acf-to-rest-api: Exposes Advanced Custom Fields Endpoints in the WP REST API v2
また、プラグインを有効化すると、通常のWP REST APIのエンドポイントでの投稿の取得にもカスタムフィールドの項目が追加されます。
http://wprest.local/wp-json/wp/v2/posts/1
{
id: 1,
date: "2016-06-21T15:03:21",
(中略)
categories: [
1
],
tags: [ ],
acf: {
text_item: "追加したテキストの内容",
bool_item: true
},
(以下略)
投稿
認証の種類
取得はプラグインを導入し、エンドポイントへ接続すれば簡単に行うことが出来るのですが、新規投稿・更新・削除などの操作を行うには認証が必要となります。
認証の方法としては主に3つあります。
- クッキー認証
- OAuth 認証
- アプリケーションパスワードまたはベーシック認証
それぞれの詳細については公式のドキュメントを参考にして下さい。
認証 | WP REST API v2 Documentation
今回は、アプリケーションパスワードによる認証を利用します。
アプリケーションパスワードでの認証は、ユーザー名・パスワードを(ほぼ)そのまま送信することとなってしまいますが、
アプリケーションパスワード自体がWordPressへのログインに使われるものではないこと、破棄が容易であることから、ある程度セキュアに利用することが出来ると思われます。
これは、あなたの通常のWordPressパスワードに代わるもので、ユニークであり破棄することが簡単で、WordPressのプロフィール画面で変更することができるものです。これらのアプリケーションパスワードは、REST-APIや旧来のXML-RPCで使用されるもので、WordPressの管理画面にログインするために使用されるものではありません。
http://ja.wp-api.org/guide/authentication/
Application Passwords plugin
そのアプリケーションパスワードを発行するために Application Passwords plugin
というプラグインを導入します。
Application Passwords — WordPress Plugins
有効化すると、ユーザーのプロフィール内、最下部にApplication Passwords
の項目が追加されるので、ここからパスワードを発行します。
ここで入力する項目は管理するための名前となっており、認証に使用されるものではありません。
適当な名前を入力し、Add New
をクリックします。
するとパスワードが追加され、すぐ下にパスワードが表示されます。
このパスワードはこの時のみ表示され、その後は二度と表示出来なくなります。
パスワード照会などもありませんので必ずどこかにメモしておく必要あります。
Your new password for test password: g22Z VHKx hWuv Puam
この画面で、一覧から、Revoke
をクリックするとこのパスワードを破棄する事ができます。
このように、発行や削除などが簡単に行えるようになっています。
新規投稿
では、このパスワードを使って新規投稿を行ってみます。
認証の際にはユーザー名とパスワードを:
コロンで区切った文字列をbase64でエンコードし、ヘッダーに追加してやる必要があります。
今回はbase64へのエンコードはコマンドで行います。
$ echo -n "test:g22Z VHKx hWuv Puam" | base64
dGVzdDpnMjJaIFZIS3ggaFd1diBQdWFt
ヘッダーへは Authorization: Basic xxx
のように追加します。
投稿は取得と同じエンドポイントへ、POSTで送信することで行うことが出来ます。
curlを利用して投稿すると以下のようになります。
$ curl --header "Authorization: Basic dGVzdDpnMjJaIFZIS3ggaFd1diBQdWFt" -X POST -d "title=From API" http://wprest.local/wp-json/wp/v2/posts
これで、 「From API」というタイトルのついた投稿が下書き状態で保存されます。
複数の項目をJSONにて送信するには、ヘッダーに、Content-Type: Application/json
を追加してやります。
送信する項目は以下とします。
{
"title":"APIからの投稿",
"content":"内容のサンプル<br />サンプル",
"status":"publish"
}
curlにて送信します。
$ curl -X POST --header "Authorization: Basic dGVzdDpnMjJaIFZIS3ggaFd1diBQdWFt" -H "Content-Type: Application/json" -d '{"title":"APIからの投稿","content":"内容のサンプル<br />サンプル","status":"publish"}' http://wprest.local/wp-json/wp/v2/posts
指定したタイトル、内容で、公開の状態で投稿されます。
カスタムフィールドの更新
ACF to REST API
を利用してカスタムフィールドの値を更新することが出来ます。
例えば、投稿IDが1
の投稿に対して更新を行う場合は以下のようにまります。
カスタムフィールドの指定は通常の項目指定と違って、fields[xxxx]
と配列で指定してやる必要があります。
$ curl -X POST --header "Authorization: Basic dGVzdDpnMjJaIFZIS3ggaFd1diBQdWFt" -d "fields[text_item]=カスタム項目の内容" http://wprest.local/wp-json/acf/v2/post/1
これで、投稿の取得からカスタムフィールドの更新までを行うことが出来ました。