[WordPress]switch_to_blog()を使うとget_terms()が動かないので、直接DBからデータを取得する

WordPressでマルチサイト可した時に、別のブログの記事を表示したい時は switch_to_blog(ブログID) のようにして、ブログを切り替えます。

以下のようにして記事に属するタクソノミーを表示させようとすると get_the_terms() の個所だけ動きません
※例:タクソノミーに「services」を設定した時

<?php switch_to_blog(2); //ブログIDが2の時 ?>
<?php while (have_posts()) : the_post(); ?>

<?php the_title(); //←表示される ?>
<?php get_the_category($post->ID); //←カテゴリー情報も取得可能 ?>
<?php get_the_terms($post->ID, "services"); //←タクソノミーは動かない ?>

<?php endwhile; ?>
<?php restore_current_blog();  ?>

 

調べた所、Wordpressは、switch_to_blog()を使った時に get_the_terms() や get_terms() のような関数を使ってタクソノミーは取得できないようです。


$wpdbを使って直接データを取得する

関数でダメならば、直接DBからデータを持ってきます。

まず、functions.phpに↓を記述します。

function get_taxonomies_by_blog_post($taxonomy, $blog_id, $post_id) {

	// ブログを切り替える
	switch_to_blog($blog_id);
	global $wpdb;

	// クエリ作成
	$query = "
	SELECT *
	FROM $wpdb->terms
	LEFT JOIN $wpdb->term_relationships
		ON $wpdb->terms.term_id = $wpdb->term_relationships.term_taxonomy_id
	LEFT JOIN $wpdb->term_taxonomy	
		ON $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id
	WHERE $wpdb->term_relationships.object_id = %d
		AND $wpdb->term_taxonomy.taxonomy = %s
	";

	// プレースホルダ
	$args = array($post_id, $taxonomy);

	// データを取得
	$taxonomies = $wpdb->get_results( $wpdb->prepare( $query, $args ) );

	// ブログを戻す
	restore_current_blog();

	return $taxonomies;
}

最後に表示させたい個所に↓の引数で get_taxonomies_by_blog_post() を実行すると情報を取得できます。

第1引数 = タクソノミー名

第2引数 = ブログID

第3引数 = 記事ID

<?php
// 第1引数=タクソノミー名、第2引数=ブログID、第3引数=記事ID
$taxonomies = get_taxonomies_by_blog_post('services', 2, 31); 

// 出力すると
print_r($taxonomies);

/* ↓のような感じ
[0] => stdClass Object
        (
            [term_id] => 2
            [name] => 登録カテゴリ名
            [slug] => slug
            [term_group] => 0
            [object_id] => 31
            [term_taxonomy_id] => 2
            [term_order] => 0
            [taxonomy] => services
            [description] => 
            [parent] => 0
            [count] => 1
        )

    [1] => stdClass Object
        (
            [term_id] => 3
            [name] => 登録カテゴリ名
            [slug] => slug2
            [term_group] => 0
            [object_id] => 31
            [term_taxonomy_id] => 3
            [term_order] => 0
            [taxonomy] => services
            [description] => 
            [parent] => 0
            [count] => 1
        )
*/


一番始めのループ内で各記事のタクソノミー名を表示する時は↓のような感じです。

<?php switch_to_blog(2); ?>
<?php while (have_posts()) : the_post(); ?>

<?php 
$services = get_taxonomies_by_blog_post('services', 2, $post->ID);
print_r($services );
foreach ($services as $key => $value) {

// ブログIDが2の記事に属するタクソノミー名を表示 
echo $value->name;
}
?>

<?php endwhile; ?>
<?php restore_current_blog(); ?>

 

これで無事、マルチサイトにしても記事に属するタクソノミー名を表示できました!

 

【追記】こちらでカスタムタクソノミーのslugが被っても大丈夫なように、更にコードを良い感じにしてくれてました。

[WordPress]マルチサイトで別ブログの記事が属するカスタムタクソノミーを取得 – Qiita
http://qiita.com/cs_sonar/items/bcc5d7fbbdef9c2db75e

この記事を書いた人:

ナカシマ

北区赤羽在住のWEBデザイナー兼エンジニア。インターネット、WordPress、本・漫画、音楽が大好き。妻と猫と暮らすアップル信者。

BLOG: 着ぐるみ追い剥ぎペンギン