[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