データベースの確認
まずは、phpMyAdminでカテゴリーの入っているテーブルを確認してみましょう。
前回の記事の「WordPressテーブル一覧」も参考にしてください。
カテゴリー名は「wp_terms」というテーブルに入っているみたいです。
おさらいもかねてこのテーブルの「name」カラムをリスト表示してみましょう。
wordpressテンプレート
$results = $wpdb->get_results($wpdb->prepare(" SELECT * FROM $wpdb->terms ")); foreach ($results as $value) { print('<li>'.$value->name.'</li>'); }
はい、簡単ですね。ただ、見ての通り表示された名前にはタグやリンクなども一緒に入っているようです。
カテゴリーだけを表示するにはこれらの情報を除外する必要がありそうです。
どれがカテゴリーでどれがタグなのかという情報は別のテーブル「 wp_term_taxonomy」で管理されています。
なので「wp_terms」と「wp_term_taxonomy」の2つのテーブルを合体させればよさそうですね。
2つのテーブルを結合する
2つのテーブルを結合するには「JOIN」というコマンドを使用します。
そして「JOIN」に続けて「ON」というコマンドで2つのテーブルの共通するカラムを結びつけます。
例えば「wp_terms」の「term_id」というカラムは「 wp_term_taxonomy」の「term_id」カラムに入っています。
では、さきほどの表示させた「name」に関連づけてtaxonomyの種類を表示させてみましょう。
wordpressテンプレート
$results = $wpdb->get_results($wpdb->prepare(" SELECT * FROM $wpdb->terms JOIN $wpdb->term_taxonomy ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id ")); foreach ($results as $value) { print('<li>【'.$value->taxonomy."】".$value->name.'</li>'); }
これで表示されているリストがどのタクソノミーに所属しているのかわかりました。
エイリアス名でコードを簡略化
ここでちょっと寄り道をしてコードの簡略化ということをしてみます。
たとえば先ほどのSQL文で「$wpdb->term_taxonomy」というテーブル名が2回出てきましたね。
まだ短いコードだから良いですか、もう少し長くなる何度もこの長いテーブル名を書かなくていけなくてちょっと大変そうです。
こんなときは、エイリアス名を付けることで簡単に記述できるようになります。
エイリアス名の書式は次の通りです。
テーブル名 AS エイリアス名
これを踏まえて先ほどのコードにエイリアス名を付けてみます。
wordpressテンプレート
$results = $wpdb->get_results($wpdb->prepare(" SELECT * FROM $wpdb->terms AS tm JOIN $wpdb->term_taxonomy AS tmt ON tm.term_id = tmt.term_id "));
USINGコマンドでコードを簡略化
「terms」と「term_taxonomy」は同じ「term_id」というカラム名でしたね。
このようにキーとなるカラム名が同じ場合「USING」コマンドを使うことでさらに短くなります。
「USING」コマンドの書式は次の通りです。
USING(共通するカラム名)
共通するのは「term_id」でしたね。
「ON」を「USING」に変えることになります。
wordpressテンプレート
$results = $wpdb->get_results($wpdb->prepare(" SELECT * FROM $wpdb->terms JOIN $wpdb->term_taxonomy USING(term_id) "));
どうでしょう。ちょっと見通しがよくなった気がしせんか。
カテゴリーだけ表示
では最後にカテゴリーだけ表示してみます。
条件の付け方は前回もやりましたが「WHERE」コマンドですね。
wordpressテンプレート
$results = $wpdb->get_results($wpdb->prepare(" SELECT * FROM $wpdb->terms AS tm JOIN $wpdb->term_taxonomy AS tmt USING(term_id) WHERE tmt.taxonomy = 'category' ")); foreach ($results as $value) { print('<li>【'.$value->taxonomy."】".$value->name.'</li>'); }
これでカテゴリー名だけ表示するリストができあがりました。