WordPress カスタム投稿ループ関連記事の設定をする
WordPressで カスタム投稿ループ関連記事の設定をするということで、
今回は本サイトに実装されているブログ投稿記事ページ(single-OOO.php)で
現在表示されているページのタームに応じて、
関連する(同じタームである)記事をサブループで表示する方法を見ていきます
今回は答えのコードから見ていきましょう
/ 現在の投稿から投稿タイプを取得
$post_type = $post->post_type;
// 現在の投稿タイプからタクソノミーを取得
$taxonomies = get_object_taxonomies( $post_type, 'objects' );
foreach ( $taxonomies as $taxonomy_slug => $taxonomy ){
// 投稿に付けられたタームを取得
$kinds = wp_get_object_terms($post->ID, $taxonomy_slug);
$kind_slug = array();
foreach( $kinds as $kind ){
array_push( $kind_slug, $kind->slug );
}
$args = array(
'post_type' => 'blogs',
'posts_per_page' => 3,
'post__not_in' => array($post->ID),
'order' => 'DESC',
'orderby' => 'modified name',
'tax_query' => array(
array(
'taxonomy' => $taxonomy_slug,
'field' => 'slug',
'terms' => $kind_slug,
'operator' => 'IN'
)
)
);
}
$the_query = new WP_Query($args);
if($the_query->have_posts()):
while($the_query->have_posts()):
$the_query->the_post();
?>
それでは順番に解説していきます
最初の行$post_type = $post->post_type;こちらはグローバル変数から現在の投稿タイプを取得しています
get_object_taxonomies(’投稿タイプ’, ‘返り値’)
get_object_taxonomiesは投稿タイプを指定してタクソノミーオブジェクトを取得しますこれで取得できるのはあくまでオブジェクトなのでこれを引数にループ処理を回します
foreach ( $taxonomies as $taxonomy_slug => $taxonomy )
ここでのポイントはループの値である$taxonomyは連想配列の値として格納してあるタクソノミー情報でありここからさらに名前やスラッグにアクセスしなければいけないということです
しかしそんなことをしなくても$taxonomiesオブジェクトのキーにタクソノミーのスラッグが指定されているのでこちらを使います
wp_get_object_terms(‘ID’, $taxonomy,’返り値’)
wp_get_object_termsは指定されたオブジェクト(複数でもよい)に付いている、指定されたタクソノミー(カスタム分類)のタームを取得します。
似たような使用法であるget_the_terms()では複数タームを指定している投稿には対応できていないためこちらを使用します
ここでは$taxonomy_slugでループ中の配列を渡してすべてのタームを取得できるようにしています
foreach( $kinds as $kind )
そうして取得した配列のターム情報をさらにループします
array_push(追加先の配列,追加する値1,追加する値2,…)
array_push();関数はPHP関数ですが上記の例の様に配列として最後尾にどんどんループしたタームが入り込んで来るようにします
最後にインスタンス変数 $WP_Query のパラメータとして設定してあげます
'tax_query' => array(
array(
'taxonomy' => '$taxonomy_slug',
'field' => 'slug',
'terms' => $kind_slug,
'operator' => 'IN'
)
)
これらの設定で関連記事を表示することが出来ました
と思っていましたが、、、、
‘taxonomy’ => ‘$taxonomy_slug’,の指定ではうまく動作してくれていませんでした
いや動作はしてくれていたのですが自分のサイトでは関連として同じタームがかぶる事が非常に多くあまりにも関連記事としては薄いため条件を変更しました
ループ中であるため上記の方法では両方のタクソノミーにどちらかが含まれていればという条件になっていました
‘taxonomy’->name;としてもループ中であるためすべてが出力されてしまいます
それを、
どちらのタクソノミーにも入っているもの、
という条件にするためにはループ無しで個々に書くしかありませんでした
「同じカテゴリーで、かつ、同じタグを持つ」という条件に変更したところ
それらしくなりました
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'oja_cat',
'field' => 'slug',
'terms' => $kind_slug,
'operator' => 'IN'
),
array(
'taxonomy' => 'oja_tags',
'field' => 'slug',
'terms' => $kind_slug,
'operator' => 'IN'
)
)
お疲れさまでした
次の機会ではチェックボックスを使用した絞り込み検索なども似たような記述法で行けそうなので挑戦してみようと思います
コメントをお待ちしております