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 が埋め込まれているので次からは更新となります。
参照と脚注
- Application PasswordによるBASIC認証でのユーザ名は、WordPressのユーザ名でありApplication Passwordを登録した時のアプリケーション名ではありません。これを勘違いしていて私はだいぶ時間をロスしました。
- Authorizationヘッダーは、ユーザ名とパスワードを
:
でつないでBase64でエンコードしただけです。
`$ echo -n 'user:applicatopn\_password' | base64dXNlcjphcHBsaWNhdG9wbl9wYXNzd29yZA==`