kano

WordPress REST APIで投稿の取得から新規投稿を行う

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

wp-res-api01

投稿の取得

有効化を行っただけで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

wp-res-api02

こちらもインストールして有効化した時点で、ACF用のエンドポイントが作られます。

以下の様にカスタムフィールドを追加したとします。

  • 追加テキスト - text_item
  • 追加フラグ - bool_item
wp-res-api04

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

wp-res-api03

有効化すると、ユーザーのプロフィール内、最下部にApplication Passwordsの項目が追加されるので、ここからパスワードを発行します。

wp-res-api05

ここで入力する項目は管理するための名前となっており、認証に使用されるものではありません。
適当な名前を入力し、Add Newをクリックします。
するとパスワードが追加され、すぐ下にパスワードが表示されます。

wp-res-api06

このパスワードはこの時のみ表示され、その後は二度と表示出来なくなります。
パスワード照会などもありませんので必ずどこかにメモしておく必要あります。

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」というタイトルのついた投稿が下書き状態で保存されます。

wp-res-api07

複数の項目を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

指定したタイトル、内容で、公開の状態で投稿されます。

wp-res-api11

カスタムフィールドの更新

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

これで、投稿の取得からカスタムフィールドの更新までを行うことが出来ました。

お問い合わせはこちら