WordPressのカテゴリをコマンドラインで抽出する


アニメ『クオリディア・コード』
東京、千葉、神奈川の生徒たちが未知の敵と戦います。生徒といっても勉強シーンは今のところ全く出てきていないです(生徒たちに戦わせるアニメが流行ってるということでしょう)。生徒たちは戦闘能力がランク付けされていて、主席ともなるととても強いです、橋とか剣ひと振りで壊せます。異能力で戦う系アニメって、毎度キャラ作りって大変だなあと思います。キャラがかぶらないように特徴づけしなきゃならないし、あえて東京千葉神奈川って分けるなら、それぞれの都市をストーリーに絡めないとならないだろうし、クリエーターってすごいですね。

キャラ作りどころかカテゴライズが苦手な私のブログは、記事が多くなってきて、カテゴリーと記事の差異が目立つようになりました。そこで、いつかカテゴリを見直す時のため、WordPressで書いている当ブログのカテゴリ一覧を抽出してみます。

まずはMySQLへ接続。

~$ mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 71059
Server version: 10.0.24-MariaDB-wsrep MariaDB Server, wsrep_25.13.raf7f02e

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

一覧を表示して、データベース名を確認します。

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> 

WordPressのデータベースに切り替えます。ここではmydbとしています。

MariaDB [(none)]> use mydb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mydb]> show tables;

カテゴリ一覧は、以下のwp_termsです。親IDとの関連性は、wp_term_taxonomyで管理されています。

MariaDB [mydb]> show tables;
+--------------------------------+
| Tables_in_mydb                 |
+--------------------------------+
| wp_commentmeta                 |
| wp_comments                    |
| wp_links                       |
| wp_options                     |
| wp_postmeta                    |
| wp_posts                       |
| wp_site_cache                  |
| wp_sitemanager_device          |
| wp_sitemanager_device_group    |
| wp_sitemanager_device_relation |
| wp_term_relationships          |
| wp_term_taxonomy               |
| wp_termmeta                    |
| wp_terms                       |
| wp_usermeta                    |
| wp_users                       |
+--------------------------------+
16 rows in set (0.00 sec)

wp_terpmsとwp_term_taxonomyのフィールドを見てみましょう。

MariaDB [mydb]> show columns from wp_terms;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| term_id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| name       | varchar(200)        | NO   | MUL |         |                |
| slug       | varchar(200)        | NO   | MUL |         |                |
| term_group | bigint(10)          | NO   |     | 0       |                |
| term_order | int(4)              | YES  |     | 0       |                |
+------------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MariaDB [mydb]> show columns from wp_term_taxonomy;
+------------------+---------------------+------+-----+---------+----------------+
| Field            | Type                | Null | Key | Default | Extra          |
+------------------+---------------------+------+-----+---------+----------------+
| term_taxonomy_id | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| term_id          | bigint(20) unsigned | NO   | MUL | 0       |                |
| taxonomy         | varchar(32)         | NO   | MUL |         |                |
| description      | longtext            | NO   |     | NULL    |                |
| parent           | bigint(20) unsigned | NO   |     | 0       |                |
| count            | bigint(20)          | NO   |     | 0       |                |
+------------------+---------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

テーブル構成が分かりました。wp_termsからは、term_idとnameを、wp_term_taxonomyからは、term_idとparentを取得するスクリプトを組みます。スクリプト名は、pull-terms.shとしました。

~$ cat pull-terms.sh
mysql -N -uroot -pパスワード DB名 -e "select term_id,name FROM wp_terms" | grep -v '予備\|未分類' > my_terms

mysql -N -uroot -pパスワード DB名 -e "select term_id,parent FROM wp_term_taxonomy" > my_taxonomy

selectの際にフィールド名を非表示にするため、 mysqlの-Nオプションを使用しています。
my_termsへ書き出す際に、grepで未使用のカテゴリを除外しています。

このスクリプトを実行して、抽出したカテゴリです。

~$ . pull-terms.h
~$ cat my_terms
2   1.基礎
3   2.テキスト整形
4   3.パターンマッチ・検索・置換
5   4.文字コード
6   5.比較・ソート
7   6.バイナリ処理
8   7.ファイル・アーカイブ
9   8.日付・時間
10  9.管理
11  10.ソース・ビルド・インストール
12  11.ドキュメント・マニュアル
14  1-1.テキスト出力
15  12.計算
16  13.その他のツールとコマンドの連携
17  1-2.繰り返し
19  ドラマ・映画・アニメ
20  1-3.コマンドライン操作
23  1-4.パイプ・フィルタ
26  1-5.ジェネレータ
29  2-1.部分抽出
31  3-1.文字列検索
32  2-2.加工
33  3-2.正規表現
35  2-3.段組
40  3-3.文字列置換
42  3-3.バイナリ置換
45  4-1.文字コード
49  5-1.比較
51  5-2.並び替え
53  5-3.ランダムに並び替え
55  Vim 
56  画像
58  データベース
60  Raspberry PI
62  Minecraft PI EDITION
64  Blender

次はjoinコマンドを使いますが、joinコマンドは、my_termsとmy_taxonomyが、ソートされていないとみなしますので(sortコマンドでオプションなしで実行した状態をソートされている状態とみなす)、–nocheck-orderを指定します。

~$ join --nocheck-order my_taxonomy my_terms | tee my_categories
2 0 1.基礎
3 0 2.テキスト整形
4 0 3.パターンマッチ・検索・置換
5 0 4.文字コード
6 0 5.比較・ソート
7 0 6.バイナリ処理
8 0 7.ファイル・アーカイブ
9 0 8.日付・時間
10 0 9.管理
11 0 10.ソース・ビルド・インストール
12 0 11.ドキュメント・マニュアル
14 2 1-1.テキスト出力
15 0 12.計算
16 0 13.その他のツールとコマンドの連携
17 2 1-2.繰り返し
19 0 ドラマ・映画・アニメ
20 2 1-3.コマンドライン操作
23 2 1-4.パイプ・フィルタ
26 2 1-5.ジェネレータ
29 3 2-1.部分抽出
31 4 3-1.文字列検索
32 3 2-2.加工
33 4 3-2.正規表現
35 3 2-3.段組
40 4 3-3.文字列置換
42 4 3-3.バイナリ置換
45 5 4-1.文字コード
49 6 5-1.比較
51 6 5-2.並び替え
53 6 5-3.ランダムに並び替え
55 16 Vim
56 16 画像
58 16 データベース
60 16 Raspberry PI
62 16 Minecraft PI EDITION
64 16 Blender
~$ 

カテゴリのID、親カテゴリID、カテゴリ名の順で格納されたカテゴリ一覧が出来上がりました。

コメント

  1. […] ← WordPressのカテゴリをコマンドラインで抽出する […]

タイトルとURLをコピーしました