Categories: WordPress開発

WordPress でデータベースから、カスタムタクソノミーで絞り込んでデータを取るときに気をつけること

WordPressはデータベースとしてMySQLを使っているCMSですが、普段の開発ではほとんど意識する必要はありません。

ですが、グローバルオブジェクトの $wpdb を使えば、直接データベースからデータを取得することもできます。

たとえば、

global $wpdb;
$sql = "SELECT * FROM $wpdb->posts";
$results = $wpdb->get_results($sql);
foreach ($pageposts as $post):
	setup_postdata($post);
	echo "

the_title();

"; endforeach;

とかすれば、全ての投稿のタイトルを表示することが出来ます。

ただ、普通に投稿を取得したりするのであれば、わざわざこんなのは必要ありません。
でも、もしWordPress外のテーブルにアクセスしたかったり、別のWordPressのデータを取得したいとかいう場合には、この方法を使わないといけません。

で、今回ハマったのは、あるカスタムタクソノミーに属するカスタム投稿を絞り込んで表示する必要があったのですが、
https://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query
を参考にしながら、やってみると、どうもうまく行きません。

ローカル環境ではばっちりなのに、本番環境では関係ない投稿を引っ張ってきてうまくいかない。
でですね、結局間違っていたとわかりました。

$sql = "SELECT * FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.term_id = 50
AND $wpdb->term_taxonomy.taxonomy = 'mytaxnomy'
AND $wpdb->posts.post_status = 'publish'

こうではなくて、

$sql = "SELECT * FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.term_taxonomy_id = 50
AND $wpdb->term_taxonomy.taxonomy = 'mytaxnomy'
AND $wpdb->posts.post_status = 'publish'";

つまり、 WHERE $wpdb->term_taxonomy.term_id = 50 が正解で、
WHERE $wpdb->term_taxonomy.term_taxonomy_id = 50 ではうまくいかない可能性がある、というわけです。

term_taxonomy.term_id と term_taxonomy.term_taxonomy_id は必ずしも一致するわけではないということでした。

あーこれも1日悩み続けてしまった。。。

nakaike