WP REST APIでBasic認証使って投稿をPOSTして、DELETEまでしてみる

いい加減POST系のリクエストも使えるようにならんとなと思ったので、触り始めてみました。

Basic認証のプラグイン

今回はhttps://github.com/WP-API/Basic-Authを使用します。

$ cd /PATH/TO/WORDPRESS/wp-content/plugins
$ git clone git@github.com:WP-API/Basic-Auth.git
$ wp plugin activate Basic-Auth

curlでPOSTリクエストを送る

WP_USER_NAMEとWP_USER_PASSWORDはWordPressへのログイン情報を使用します。

$ curl --user WP_USER_NAME:WP_USER_PASSWORD http://example.com/wp-json/wp/v2/posts -XPOST | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   155    0   155    0     0     64      0 --:--:--  0:00:02 --:--:--    64
{
  "code": "empty_content",
  "message": "本文、タイトル、抜粋が空欄です。",
  "data": {
    "status": 400
  }
}

投稿を作成する

curlの場合は以下のようにして記事情報をPOSTします。

$ curl --user WP_USER_NAME:WP_USER_PASSWORD http://example.com/wp-json/wp/v2/posts -XPOST -d 'title=title' -d 'content=sample content' -d 'slug=api-sample'

成功した場合は、以下のようなレスポンスが返ってきます。

{
  "id": 3791,
  "date": "2016-09-14T21:15:25",
  "date_gmt": null,
  "guid": {
    "rendered": "https://wp-kyoto.net/?p=3791",
    "raw": "https://wp-kyoto.net/?p=3791"
  },
  "modified": "2016-09-14T21:15:25",
  "modified_gmt": null,
  "password": "",
  "slug": "api-sample",
  "status": "draft",
  "type": "post",
  "link": "https://wp-kyoto.net/?p=3791",
  "title": {
    "raw": "title",
    "rendered": "title"
  },
  "content": {
    "raw": "sample content",
    "rendered": "<p>sample content</p>"
  },
  "excerpt": {
    "raw": "",
    "rendered": "<p>sample content</p>"
  },
  "author": 1,
  "featured_media": 0,
  "comment_status": "open",
  "ping_status": "closed",
  "sticky": false,
  "format": "standard",
  "categories": [
    1
  ],
  "tags": [],
  "_links": {
    "self": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/posts/3791"
      }
    ],
    "collection": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/posts"
      }
    ],
    "about": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/types/post"
      }
    ],
    "author": [
      {
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/users/1"
      }
    ],
    "replies": [
      {
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/comments?post=3791"
      }
    ],
    "version-history": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/posts/3791/revisions"
      }
    ],
    "wp:attachment": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/media?parent=3791"
      }
    ],
    "wp:term": [
      {
        "taxonomy": "category",
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/categories?post=3791"
      },
      {
        "taxonomy": "post_tag",
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/tags?post=3791"
      }
    ],
    "curies": [
      {
        "name": "wp",
        "href": "https://api.w.org/{rel}",
        "templated": true
      }
    ]
  }
}

POSTした記事を見る

デフォルトでは下書き(draft)として保存されているので、GET /wp/v2/posts/{POST_ID}だけだと以下のようにエラーになります。

$ curl http://example.com/wp-json/wp/v2/posts/3791 | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   168    0   168    0     0    176      0 --:--:-- --:--:-- --:--:--   176
{
  "code": "rest_forbidden",
  "message": "その操作を実行する権限がありません。",
  "data": {
    "status": 403
  }
}

ここも認証情報をつけて送りましょう。

$ curl --user WP_USER_NAME:WP_USER_PASSWORD http://example.com/wp-json/wp/v2/posts/3791 | jq .
{
  "id": 3791,
  "date": "2016-09-14T21:15:25",
  "date_gmt": null,
  "guid": {
    "rendered": "https://wp-kyoto.net/?p=3791"
  },
  "modified": "2016-09-14T21:15:25",
  "modified_gmt": null,
  "slug": "api-sample",
  "type": "post",
  "link": "https://wp-kyoto.net/?p=3791",
  "title": {
    "rendered": "title"
  },
  "content": {
    "rendered": "<p>sample content</p>"
  },
  "excerpt": {
    "rendered": "<p>sample content</p>"
  },
  "author": 1,
  "featured_media": 0,
  "comment_status": "open",
  "ping_status": "closed",
  "sticky": false,
  "format": "standard",
  "categories": [
    1
  ],
  "tags": [],
  "_links": {
    "self": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/posts/3791"
      }
    ],
    "collection": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/posts"
      }
    ],
    "about": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/types/post"
      }
    ],
    "author": [
      {
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/users/1"
      }
    ],
    "replies": [
      {
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/comments?post=3791"
      }
    ],
    "version-history": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/posts/3791/revisions"
      }
    ],
    "wp:attachment": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/media?parent=3791"
      }
    ],
    "wp:term": [
      {
        "taxonomy": "category",
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/categories?post=3791"
      },
      {
        "taxonomy": "post_tag",
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/tags?post=3791"
      }
    ],
    "curies": [
      {
        "name": "wp",
        "href": "https://api.w.org/{rel}",
        "templated": true
      }
    ]
  }
}

管理画面から見る

WP APIからPOSTした結果
元のリクエスト内容に含まれていたtitlecontentslugが反映されてるのがわかります。

作った下書きを削除する

作った記事は消しちゃいましょう。
DELETE wp/v2/posts/{POST_ID}で消せます。

$ curl --user WP_USER_NAME:WP_USER_PASSWORD http://example.com/wp-json/wp/v2/posts/3791 -XDELETE | jq .

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3632    0  3632    0     0   1137      0 --:--:--  0:00:03 --:--:--  1137
{
  "id": 3791,
  "date": "2016-09-14T21:15:25",
  "date_gmt": null,
  "guid": {
    "rendered": "https://wp-kyoto.net/?p=3791",
    "raw": "https://wp-kyoto.net/?p=3791"
  },
  "modified": "2016-09-14T21:15:25",
  "modified_gmt": null,
  "password": "",
  "slug": "api-sample",
  "status": "draft",
  "type": "post",
  "link": "https://wp-kyoto.net/?p=3791",
  "title": {
    "raw": "title",
    "rendered": "title"
  },
  "content": {
    "raw": "sample content",
    "rendered": "<p>sample content</p>"
  },
  "excerpt": {
    "raw": "",
    "rendered": "<p>sample content</p>"
  },
  "author": 1,
  "featured_media": 0,
  "comment_status": "open",
  "ping_status": "closed",
  "sticky": false,
  "format": "standard",
  "categories": [
    1
  ],
  "tags": [],
  "_links": {
    "self": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/posts/3791"
      }
    ],
    "collection": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/posts"
      }
    ],
    "about": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/types/post"
      }
    ],
    "author": [
      {
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/users/1"
      }
    ],
    "replies": [
      {
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/comments?post=3791"
      }
    ],
    "version-history": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/posts/3791/revisions"
      }
    ],
    "wp:attachment": [
      {
        "href": "https://wp-kyoto.net/wp-json/wp/v2/media?parent=3791"
      }
    ],
    "wp:term": [
      {
        "taxonomy": "category",
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/categories?post=3791"
      },
      {
        "taxonomy": "post_tag",
        "embeddable": true,
        "href": "https://wp-kyoto.net/wp-json/wp/v2/tags?post=3791"
      }
    ],
    "curies": [
      {
        "name": "wp",
        "href": "https://api.w.org/{rel}",
        "templated": true
      }
    ]
  }

あまり消せた感ないなーという気はしますが、ちゃんと消えてます。

もう一度GETしてslugを見ると、以下のように__trashedがついているのがわかります。

$ curl --user WP_USER_NAME:WP_USER_PASSWORD http://example.com/wp-json/wp/v2/posts/3791 | jq .slug
"api-sample__trashed"

あとはこの辺のリクエスト処理をbashでやるなり、PythonやJSでやるなり自由にするといいかなと思います。

Follow me!

Okamoto Hidetaka
デジタルキューブのインフラエンジニア。勉強会に和太鼓の練習から直行することが多く「太鼓の人」とかよばれてます。 思いつきで公式ディレクトリにテーマやプラグインをアップしたりテーマレビューやったりしています。 AWS / WordPress / LinkedOpenData周りで活動していて、APIをどうこうして何か作るというのが多いです。 ひとこと
mautic is open source marketing automation