WordPress REST APIを使った投稿と更新

目次

WordPress の REST API(v2)を使用して記事の投稿と更新をしてみました。どうやって OAuth POST を PHP からするか少し悩みましたが、分かってみると簡単に WordPress の REST API を使用出来ました。

セットアップ

WordPress REST API を使うには、REST API のプラグインと認証プラグインをインストールして有効にしておく必要があります。

REST API プラグイン

REST API(v2)プラグインは、通常のプラグインと同様に WordPress のダッシュボードからプラグインを検索してインストールします。

Application Password を使用する場合

Application Password は、ネット上を生のパスワードが流れます。 ローカル環境で使用するときには簡単で便利ですが、本番環境では必ず通信経路が暗号化された HTTPS(SSL/TSL)で接続する必要があります。

Application Password を使用する場合は、OAuth プラグインと同様にApplication Password プラグインのページからアーカイブをダウンロードしてインストールします。

プラグインを有効にしたら、WordPress のダッシュボードから「ユーザー > あなたのプロフィール」と進んで、ページの最後の方にある「Application Passwords」でパスワードを自動生成します。このパスワードは再表示と修正はできないので、表示されたら安全な所に記録しておきます。修正や再確認が必要なときは、「Revoke」ボタンで現在のパスワードを無効にして再生成することになります。

Oauth を使用する場合

OAuth を使用する場合は、OAuth プラグインの GitHub ページからアーカイブを取得して、OAuth プラグインをインストールします。

プラグインのインストールして有効にしたら、OAuth キーを取得しておきます。OAuth キーの取得方法は、WORDPRESS REST API の OAUTH トークンを取得を参照して下さい。

OAuth ライブラリ

プログラムから OAuth 認証を使用するにはライブラリーが必要です。

言語 ライブラリ名
Ruby Oauth
PHP HTTP_OAuth
Pyhton Requests-OAuthlib

記事の投稿と更新サンプル

Application Password でのサンプル

Application Password は普通の BASIC 認証と同じなので、curlコマンドにユーザ名(注1)とアプリケーションパスワードを引数として渡すことで簡単に API を叩くことができます。

#!/bin/bash

read -r -d '' json << _EOM_
  {
    "title": "Post new draft with cat 2",
    "content": "TEST<br/>TEST",
    "categories": [2],
    "status": "draft"
  }
_EOM_

curl -X POST \
     -u "user:applicatopn_password" \
     -H "Content-Type: application/json" \
     -d "$json" \
     https://MY_WORDPRESS_SITE/wp-json/wp/v2/posts

-uオプションを指定しないでも、エンコード済みの Authorization ヘッダー(注2)を加えても API にアクセスできます。

curl -X POST \
     -H "Authorization: Basic dXNlcjphcHBsaWNhdG9wbl9wYXNzd29yZA==" \
     -H "Content-Type: application/json" \
     -d "$json" \
     https://books.nosuz.jp/wp-json/wp/v2/posts

BASIC 認証方法は、パスワードを Base64 でエンコードしているだけなので簡単にデコードして読み取ることができます。

$ echo dXNlcjphcHBsaWNhdG9wbl9wYXNzd29yZA==|base64 -d
user:applicatopn_password

OAuth でのサンプル

OAuth のサンプルは、PHP とその OAuth ライブラリHTTP_OAuthを使用しました。ライブラリのインストール方法は、WORDPRESS REST API の OAUTH トークンを取得を参照して下さい。

PHP から OAuth 認証で POST する時に、HTTP_OAuth ライブラリにデータを指定する方法が分からず少し困りました。しかし HTTP_Request2 のインスタンスにデータをセットし、それを HTTP_OAuth に渡すことで OAuth 認証で POST できました。

require_once('HTTP/OAuth/Consumer.php');

oauth = new HTTP_OAuth_Consumer( oauth_secret->client_key,
    oauth_secret->client_secret, oauth_secret->access_key,
    oauth_secret->access_secret
);

# POST OAuth http_request = new HTTP_Request2();
http_request->setHeader("Content-Type: application/json"); http_request->setBody(json_encode(article)); consumer_request = new HTTP_OAuth_Consumer_Request();
consumer_request->accept( http_request);
oauth->accept( consumer_request);
result = oauth->sendRequest($post_endpoint)->getResponse();

これを使って WordPress に記事を投稿と更新するプログラムを書いてみました。このプログラムは、HTTP_OAuth ライブラリの他にテンプレートエンジンの Twig を使用しています。

php のビルトインサーバを起動させて

php -S localhost:8080

http://localhost:8080/wp-post.phpにアクセスします。最初にアクセスした時には新規投稿となり、結果には記事の ID が埋め込まれているので次からは更新となります。

参照と脚注

  1. Application PasswordによるBASIC認証でのユーザ名は、WordPressのユーザ名でありApplication Passwordを登録した時のアプリケーション名ではありません。これを勘違いしていて私はだいぶ時間をロスしました。
  2. Authorizationヘッダーは、ユーザ名とパスワードを:でつないでBase64でエンコードしただけです。
`$ echo -n 'user:applicatopn\_password' | base64dXNlcjphcHBsaWNhdG9wbl9wYXNzd29yZA==`