WordPress MySQLでタームを一気に登録する(例:都道府県)

  • MySQL
  • WordPress

WordPress でタームを登録する際、数が少ないなら手動で問題ありませんが、大量のタームをあらかじめ登録しなくてはならない時に手動ではやってられません。ここではよくありがちな、47都道府県のタームを同時に登録する手順について書いていきます。

タクソノミーを作成する

まずはタームを登録するためのタクソノミーを作成します。Custom Post Type UI などのプラグインを使うか、function.php でregister_taxonomy()を使用して作成してください。

ここでは例として、「prefectures」というスラッグでタクソノミーを作成したとして進めていきます。

タームを登録する

タームリストを作る

タームの登録には、

  • 名前
  • スラッグ

の二つが必須になります。タームのスラッグはタームの名前と一緒でも構いませんが、日本語名というのは微妙なので今回は分けます。都道府県の登録のために、下記のような「名前 ターム名」のリストを用意しました。

北海道 hokkaido 100

青森県 aomori 101
岩手県 iwate 101
秋田県 akita 101
宮城県 miyagi 101
山形県 yamagata 101
福島県 fukushima 101

茨城県 ibaraki 102
栃木県 tochigi 102
群馬県 gunma 102
埼玉県 saitama 102
千葉県 chiba 102
東京都 tokyo 102
神奈川県 kanagawa 102

新潟県 niigata 103
富山県 toyama 103
石川県 ishikawa 103
福井県 fukui 103
山梨県 yamanashi 103
長野県 nagano 103
岐阜県 gifu 103
静岡県 shizuoka 103
愛知県 aichi 103

滋賀県 shiga 104
京都府 kyoto 104
大阪府 osaka 104
兵庫県 hyogo 104
奈良県 nara 104
三重県 mie 104
和歌山県 wakayama 104

鳥取県 tottori 105
島根県 shimane 105
岡山県 okayama 105
広島県 hiroshima 105
山口県 yamaguchi 105

徳島県 tokushima 106
香川県 kagawa 106
愛媛県 ehime 106
高知県 kochi 106

福岡県 fukuoka 107
佐賀県 saga 107
長崎県 nagasaki 107
大分県 oita 107
熊本県 kumamoto 107
宮崎県 miyazaki 107
鹿児島県 kagoshima 107

沖縄県 okinawa 108

名前、スラッグ、タームグループをそれぞれ半角空白で区切っています。

最後のタームグループ(term_group)は何のためにあるカラムなのかイマイチわかっていないのですが、WordPress 側でもまだどう使うかしっかり決まってないようです。

今回は都道府県の地域区分(関東や東北など)の分類のために、タームグループには100〜108の番号をつけています。特に意味のある数字ではないので、すでに100〜108を使用しているなら別の連番に書き換えるか、そもそも区分なんかわけなくていい!という場合は「0」で構いません。

それでは、用意したテキストを正規表現で SQL 文に置換します。Atom や Brackets など正規表現を使用できるテキストエディタで置換してください。

置換対象

^(\S+)\s(\S+)\s(\S+)$

置換テキスト

INSERT INTO wp_terms (name, slug, term_group) VALUES ('$1', '$2', $3);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

都道府県登録SQL

置換すると下記になりますので、これを流し込めばできる…はず。

INSERT INTO wp_terms (name, slug, term_group) VALUES ('北海道', 'hokkaido', 100);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

INSERT INTO wp_terms (name, slug, term_group) VALUES ('青森県', 'aomori', 101);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('岩手県', 'iwate', 101);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('秋田県', 'akita', 101);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('宮城県', 'miyagi', 101);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('山形県', 'yamagata', 101);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('福島県', 'fukushima', 101);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

INSERT INTO wp_terms (name, slug, term_group) VALUES ('茨城県', 'ibaraki', 102);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('栃木県', 'tochigi', 102);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('群馬県', 'gunma', 102);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('埼玉県', 'saitama', 102);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('千葉県', 'chiba', 102);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('東京都', 'tokyo', 102);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('神奈川県', 'kanagawa', 102);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

INSERT INTO wp_terms (name, slug, term_group) VALUES ('新潟県', 'niigata', 103);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('富山県', 'toyama', 103);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('石川県', 'ishikawa', 103);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('福井県', 'fukui', 103);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('山梨県', 'yamanashi', 103);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('長野県', 'nagano', 103);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('岐阜県', 'gifu', 103);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('静岡県', 'shizuoka', 103);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('愛知県', 'aichi', 103);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

INSERT INTO wp_terms (name, slug, term_group) VALUES ('滋賀県', 'shiga', 104);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('京都府', 'kyoto', 104);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('大阪府', 'osaka', 104);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('兵庫県', 'hyogo', 104);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('奈良県', 'nara', 104);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('三重県', 'mie', 104);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('和歌山県', 'wakayama', 104);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

INSERT INTO wp_terms (name, slug, term_group) VALUES ('鳥取県', 'tottori', 105);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('島根県', 'shimane', 105);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('岡山県', 'okayama', 105);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('広島県', 'hiroshima', 105);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('山口県', 'yamaguchi', 105);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

INSERT INTO wp_terms (name, slug, term_group) VALUES ('徳島県', 'tokushima', 106);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('香川県', 'kagawa', 106);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('愛媛県', 'ehime', 106);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('高知県', 'kochi', 106);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

INSERT INTO wp_terms (name, slug, term_group) VALUES ('福岡県', 'fukuoka', 107);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('佐賀県', 'saga', 107);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('長崎県', 'nagasaki', 107);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('大分県', 'oita', 107);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('熊本県', 'kumamoto', 107);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('宮崎県', 'miyazaki', 107);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');
INSERT INTO wp_terms (name, slug, term_group) VALUES ('鹿児島県', 'kagoshima', 107);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

INSERT INTO wp_terms (name, slug, term_group) VALUES ('沖縄県', 'okinawa', 108);
INSERT INTO wp_term_taxonomy (term_id, taxonomy, description) VALUES ((SELECT LAST_INSERT_ID()), 'prefectures', '');

一点、管理画面の方で存在はしている(タームの個数は47と出ている)のにターム自体が表示されないという現象がありました。WordPress のキャッシュ関連のせいなのか不明でしたが、管理画面から新規タームを登録・更新するなどして何らかのアクションを起こすことで表示されるようになりました。

SELECT LAST_INSERT_ID()については、「最後に INSERT したレコードの ID」を取得できるようなので、その ID をもとにして wp_term_taxonomy に INSERT しています。

SQL文もバルクで書けばすっきりするのですが、その際に INSERT した ID を取得する方法がわからなかったため一つずつ分割しました。

参考: https://gist.github.com/mugifly/d6e68a516de4a008687c

テーブルについて

今回データを流し込んだテーブルについて少し解説しておきます。

wp_terms

これは主にタームを登録しておくテーブルです。ここに名前やスラッグの情報が入ります。単にそれだけです。ここに登録しただけでは「どのタクソノミーに紐付いているタームなのか」がわからないので、管理画面から見ることができないはずです。

wp_term_taxonomy

こちらは先程の wp_terms にある ID をもとにして、「このIDのタームはこのタクソノミーに紐付いている」という情報などを持っているテーブルです。ここに登録することで初めてタームがタクソノミーと紐付きます。

ターム関連の構成は意外とシンプルなので、一度DBを見てみると良いかもです。