WEBOPIXEL

WordPressのwpdbオブジェクトで複数のテーブルを扱う

Posted: 2010.09.06 / Category: WordPress / Tag: 

以前「WordPressからデータベースに直接アクセスする」という記事を書きましたが、これだけだと一つのテーブルからしかデータが取り出せないので、できることはまだまだ少ない感じです。
この記事では第2段としてwpdbオブジェクトを使用して複数のテーブルのデータを取り扱いたいと思います。
最初に断言しておくとMySQLの学習的意味合いが強いので、実用性はないです。

Sponsored Link

データベースの確認

まずは、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>');
		}
	

これでカテゴリー名だけ表示するリストができあがりました。