[WordPress]WordPress REST APIでカテゴリを追加してみる

現在新しいサイトをWordpressで構築しています。Wordpressにカテゴリのデータをそこそこ投入しなければならず、管理画面からポチポチやるのはめんどくさいなと思っていたところ、どうやらWordpress REST APIにて可能なようで、それを試してみました

WordPress APIについて

概要

WordPress APIはHTTPベースのREST APIを提供しており、REST APIを通じて、投稿やカテゴリ、ユーザーなどのWordPressで管理している情報に対してCRUD操作ができます。(GUI管理画面でできることが全て網羅されているかは不明ですが、下記に対するAPIは準備されています。)

Version 4.7からWordPress APIはデフォルトで有効になっており、公開情報に属しているものに関しては、認証せずとも情報にアクセスできたりします。(設定により見えなくすることも可能)
例えば、WordPressのユーザー情報は下記のようなURLで誰でもアクセス可能です。
https://xxxxx/wp-json/wp/v2/users

一方でデータの更新/削除/追加作業に関しては認証が必要となります。

認証方法

APIの認証方法には、Cookie認証、OAuth認証、パスワード認証があり、今回は一番手軽にできそうなパスワード認証を試してみました。
パスワード認証はApplication PasswordというPluginを使って認証を行います。

他のサイトでPythonのソースコードも含めとてもわかり易く手順を解説されているブログを発見してのでそちらをご参照ください!
【WP REST API】Word Press APIのパスワード設定方法
http://mojitoba.com/2019/01/21/wp_rest_api_prepare/
【WP REST API解説】投稿を作成する(POST /posts)
https://mojitoba.com/2019/01/22/wp_rest_api_posts/

ハマったところ

上記サイトを参照して、PythonでAPI経由で記事の投稿を試したところ、下記のような401エラーが出てきてしまいました。
{‘code’: ‘rest_cannot_create’, ‘message’: ‘このユーザーとして投稿を編集する権限がありません。’, ‘data’: {‘status’: 401}}

.htaccessに下記の行を追加することで動作するようになりました。
RewriteRule .* – [E=REMOTE_USER:%{HTTP:Authorization}]

参考になりそうなリンク

・本家のAPIのDocument
https://ja.wp-api.org/

[本題]WordPress APIでカテゴリを作成する

内容

今回は、pythonでAPIを叩いて、北海道、東北,,,, 九州のような地方の名称のカテゴリ追加したいと思います。
/wp/v2/categoriesに対して、POSTを行うことで実行可能です。

下記はAPIの引数になります。

https://developer.wordpress.org/rest-api/reference/categories/#create-a-category

この中で必須なのはname(カテゴリ名)のみとなりますが、slug(URL部分)も合わせて投入しています。
Descriptionはカテゴリ名と同一にしています。

データ(chihou.csv)

下記のようなCSVファイルを作成し、それらをPythonで読み込み追加していく形にしています。

北海道,hokkaidou
東北,tohoku
関東,kanto
中部,chubu
近畿,kinki
中国,chugoku
四国,shikoku
九州,kyusyu

ソースコード

import requests
import base64
import urllib.request
import json
import csv

def create_categories(description, name, slug):
    # カテゴリ追加に必要なパラメータ
    payload = {
        'description': description,
        'name': name,
        'slug': slug
    }

    # ヘッダーとPost
    headers = {'content-type': "Application/json"}
    r = requests.post(end_point_url, data=json.dumps(payload), headers=headers, auth=(user_id, passward))

    # 確認
    print(r.status_code)  # 201が表示されれば成功
    print(r.json()) #返りの値が表示される(作成されたカテゴリのIDなど)


### 投稿に必要な情報 ###
# ユーザーID
user_id = "xxxx"

# APIパスワード
passward = 'xxxxxx'

# リクエストURL
end_point_url ="http://xxxx.com/wp-json/wp/v2/categories"


with open('data/chihou.csv', 'r',encoding="utf-8_sig") as f:
    reader = csv.reader(f)
    for row in reader:
        create_categories(row[0], row[0], row[1])



備考

親カテゴリを指定したい場合は、下記のようにpayload部分でparentにしたいカテゴリのID(wordpress apiやmysqlなどで確認可能)を指定することで可能となります。

payload = {
‘description’: description,
‘name’: name,
‘parent’: 85,
‘slug’: slug }

確認方法

上記PythonファイルをRUNして、特にエラーがでなかったら、Wordpress管理画面でカテゴリが追加されていることを確認できかと思います。