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' | base64
    dXNlcjphcHBsaWNhdG9wbl9wYXNzd29yZA==
    

「WordPress REST APIを使った投稿と更新」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です