[WP3.8] タグの親子関係も考慮したタグ表示

カテゴリとタグはもともと同じ wp_terms というテーブルで登録されており、
wp_term_taxonomy というテーブルの taxonomy の値で、
カテゴリかタグかが識別される仕様になっています。
また同じ wp_term_taxonomy の parent で親子関係が定義できるようです。

それならタグも親子関係が持てるだろう!ということで、ちょっといじくってみました。
テスト用に作った タグA という親タグの下に、タグAA という子タグを設定してみます。
これはどうもデフォルトの管理画面からはできなさそうなので、SQLで・・・
ちなみに 作業前のテーブルはこんな感じ。

mysql> select * from wp_terms;
+---------+-----------------------+---------------------------------------------------------------------------------------------------------------+------------+
| term_id | name                  | slug                                                                                                          | term_group |
+---------+-----------------------+---------------------------------------------------------------------------------------------------------------+------------+
|       1 | 未分類                | %e6%9c%aa%e5%88%86%e9%a1%9e                                                                                   |          0 |
|       2 | 商品                  | item                                                                                                          |          0 |
|       3 | お勧め商品            | itemreco                                                                                                      |          0 |
|       4 | 新商品                | itemnew                                                                                                       |          0 |
|       5 | 商品ジャンル          | itemgenre                                                                                                     |          0 |
|       6 | タグA                 | %e3%82%bf%e3%82%b0a                                                                                           |          0 |
|       7 | タグB                 | %e3%82%bf%e3%82%b0b                                                                                           |          0 |
|       8 | タグC                 | %e3%82%bf%e3%82%b0c                                                                                           |          0 |
|       9 | カテゴリーA          | %e3%82%ab%e3%83%86%e3%82%b4%e3%83%aa%e3%83%bc%ef%bd%81                                                        |          0 |
|      10 | カテゴリーA’         | %e3%82%ab%e3%83%86%e3%82%b4%e3%83%aa%e3%83%bc%ef%bd%81-%e3%82%ab%e3%83%86%e3%82%b4%e3%83%aa%e3%83%bc%ef%bd%81 |          0 |
|      12 | タグAA                | %e3%82%bf%e3%82%b0aa                                                                                          |          0 |
+---------+-----------------------+---------------------------------------------------------------------------------------------------------------+------------+
11 rows in set (0.00 sec)

mysql> select * from wp_term_taxonomy;
+------------------+---------+----------+-------------+--------+-------+
| term_taxonomy_id | term_id | taxonomy | description | parent | count |
+------------------+---------+----------+-------------+--------+-------+
|                1 |       1 | category |             |      0 |     6 |
|                2 |       2 | category |             |      0 |     0 |
|                3 |       3 | category |             |      2 |     0 |
|                4 |       4 | category |             |      2 |     0 |
|                5 |       5 | category |             |      2 |     0 |
|                6 |       6 | post_tag |             |      0 |     2 |
|                7 |       7 | post_tag |             |      0 |     1 |
|                8 |       8 | post_tag |             |      0 |     1 |
|                9 |       9 | category |             |      0 |     1 |
|               10 |      10 | category |             |      9 |     1 |
|               12 |      12 | post_tag |             |      0 |     1 |
+------------------+---------+----------+-------------+--------+-------+
11 rows in set (0.00 sec)

ということで、親タグは term_id は 6 で、子タグの term_id は 12 だったので、
以下のようなSQLになると思います。

update wp_term_taxonomy set parent = 6 where term_id = 12;

これで term_id が 12 の parent が 6 になりました。

mysql> select * from wp_term_taxonomy;
+------------------+---------+----------+-------------+--------+-------+
| term_taxonomy_id | term_id | taxonomy | description | parent | count |
+------------------+---------+----------+-------------+--------+-------+
|                1 |       1 | category |             |      0 |     6 |
|                2 |       2 | category |             |      0 |     0 |
|                3 |       3 | category |             |      2 |     0 |
|                4 |       4 | category |             |      2 |     0 |
|                5 |       5 | category |             |      2 |     0 |
|                6 |       6 | post_tag |             |      0 |     2 |
|                7 |       7 | post_tag |             |      0 |     1 |
|                8 |       8 | post_tag |             |      0 |     1 |
|                9 |       9 | category |             |      0 |     1 |
|               10 |      10 | category |             |      9 |     1 |
|               12 |      12 | post_tag |             |      6 |     1 |
+------------------+---------+----------+-------------+--------+-------+
11 rows in set (0.00 sec)

親子関係のメリットは子タグをまとめてグルーピングできるという点ですので、
term_id が 6 もしくは 親term_id が 6 の記事を一覧表示するコードを書いてみました。

<?php
    $arrPosts = $wpdb->get_results("select p.ID, p.post_title from wp_posts as p left join wp_term_relationships as tr on p.ID = tr.object_id left join wp_term_taxonomy as tt on tr.term_taxonomy_id = tt.term_taxonomy_id left join wp_terms as t on t.term_id = tt.term_id where tt.term_id = 6 or tt.parent = 6 order by post_date desc");
    echo '<ul>';
    foreach($arrPosts as $arrPost){
        echo '<a href="/?p=' . $arrPost->ID . '">' . $arrPost->post_title . '</a></li><br />';
    }
    echo '</ul>';
?>

さらにタグ名が’タグA’ もしくは親タグ名が’タグA’の記事を一覧表示するコードも書いてみました。

<?php
    $tag_name = 'タグA';
    $term_id = $wpdb->get_var($wpdb->prepare("select term_id from wp_terms where name = %s", $tag_name));

    $arrPosts = $wpdb->get_results($wpdb->prepare("select p.ID, p.post_title from wp_posts as p left join wp_term_relationships as tr on p.ID = tr.object_id left join wp_term_taxonomy as tt on tr.term_taxonomy_id = tt.term_taxonomy_id left join wp_terms as t on t.term_id = tt.term_id where tt.term_id = %d or tt.parent = %d order by post_date desc", $term_id, $term_id));
    echo '<ul>';
    foreach($arrPosts as $arrPost){
        echo '<a href="/?p=' . $arrPost->ID . '">' . $arrPost->post_title . '</a></li><br />';
    }
    echo '</ul>';
?>
カテゴリー: 未分類   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

* Copy This Password *

* Type Or Paste Password Here *

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>