プラグインなしでワードプレスのカテゴリーをデータベースから一括登録する

  • ワードプレスのカテゴリーを一括登録する際、以前は便利なプラグインがあった

This plugin has been closed as of August 5, 2022 and is not available for download. Reason: Security Issue.

  • 数百のカテゴリーを登録したかったので、手動での対応は不可能
  • phpMyAdmin から SQL 文で INSERT することにした
    • CSV でのアップロードも可能ではあるが、後述する null の値の記述方法がわからなかったので SQL で実施
      • 空白にすると空白文字列に、null にすると文字列として扱われてしまう

ワードプレスのデータベース MySQL におけるカテゴリーの扱い

  • 以下のような形でデータを紐付けて管理しているよう
    1. テーブル wp_terms → 各ターム
    2. テーブル wp_term_taxonomy → 各タームとタクソノミー(分類)を紐付ける
  • はじめ wp_terms だけを登録していて、ワードプレス管理画面を見ても反映されなかったため「?」となっていたが、 wp_term_taxonomy で紐付けを行う必要があった

タームとタクソノミー

  • ターム
    • 単一のカテゴリーやタグの「名前・スラッグなど」の情報
  • タクソノミー
    • タームの括りを分類するもの
  • 例)
    • カテゴリー「北海道」
      • 「カテゴリー」という名前のタクソノミーに分類された、「北海道」という名前を持つターム
    • タグ「北海道」
      • 「タグ」という名前のタクソノミーに分類された、「北海道」という名前を持つターム

  • ざっくりした言い方をすると、「カテゴリー」という名前のカテゴリーの中の「北海道」というカテゴリー、みたいなトンチっぽい内容
  • なので、wp_terms にはワードプレスのカテゴリーもタグも、それぞれのタームはすべてこのテーブルに集約される
    • それらを各タクソノミーに紐付ける必要がある
      • そりゃ、wp_terms だけ登録してもワードプレス上には反映されないわけだ。。

データベースからカテゴリーを一括登録

  • もっと良いやり方があるのかもしれないが、ひとまず下記の方法で実現はできた

(はじめに)補足

  • 各種 ID を null にするのはワードプレスの仕様上、新規データは連番で自動で割り当てされていくため、空白ではなく null を指定する必要があるらしい
  • (かなり愚直なやり方だとは思うが)下記の SQL 文を VS Code なりで行を一括複製すれば一瞬で作業を終えることができる
    • 試しに 47 都道府県をカテゴリー一括登録した際、各テーブルとも 1 秒未満で処理を実施できた

Step 1 : テーブル wp_terms 登録

  • カラム名
    • term_id, name, slug, term_group, term_order
INSERT INTO wp_terms VALUES(null, '北海道', 'hokkaido', '0', '1');
  • term_idnull
  • name'カテゴリー名'
  • slug'カテゴリースラッグ'
  • term_group'0' (よく知らない)
  • term_order'1' (カテゴリーの並び順)

Step 2 : テーブル wp_terms の情報をダウンロード

  • テーブル wp_terms の情報をダウンロードして、各タームの term_id を把握しておく
  • ↓ ↓ ↓ ↓ ↓
  • 前述の通り、基本的にはワードプレス上で管理される各種情報の ID は「連番」で登録されていくはず (?) なので、VS Code で行を複製して連番をふる拡張機能を使えば簡単に SQL 文各行を生成できる

Step 3 : テーブル wp_term_taxonomy 登録

  • カラム名
    • term_taxonomy_id, term_id, taxonomy, description, parent, count
INSERT INTO wp_term_taxonomy VALUES(null, '60', 'category', '', '0', '0');
  • term_taxonomy_idnull
  • term_id'60'(wp_terms の term_id に登録された ID)
  • taxonomy'category'(タグの場合は post_tag
  • description''
  • parent'0'(親子階層にするならいじる?)
  • count'0'(とりあえず新規登録なので 0 で良さげ)

参考