WordPressで用いるWP Query。
便利ですね(慣れれば)。
さて,表示している記事のもつ「カテゴリ」または「タグ」を含む記事を検索するためには,どうすれば良いのかを調べました。
現在のカテゴリを「get the category」関数で取得します。
$categories = get_the_category();
その後,他のテンプレートで使えるようにset_query_var関数に投げます。
set_query_var('categories', $categories);
カテゴリと同様にタグも取得して,他のテンプレートで使えるように設定します。
$tags = get_the_tags();
set_query_var('tags', $tags);
こちらのページでは,変数の受け渡しはset_query_varを使うように指示されています。
テンプレートは require によって読み込まれるので、その中からは呼び出し元テーマの PHP コードで定義された変数をアクセスできません。その変数を global 宣言すればアクセス可能です。
関数リファレンス/get template part
しかし get_template_part() の内部で呼び出される load_template() /en は、WP_Query クエリ変数をすべて extract して、読み込むテンプレートのスコープへ入れます。従って set_query_var() を使えば変数をテンプレートパーツで使えるようにできます。
しかし,WordPressのバージョンが上がって,5.5からは,set_query_varなど使わなくても,get_template_partの引数に変数を渡すことができるようです。
get_template_part( string $slug, string $name = null, array $args = array() )
https://developer.wordpress.org/reference/functions/get_template_part/
$args
(array) (Optional) Additional arguments passed to the template.
Default value: array()
というわけで,set_query_varは使わなくて良いみたいですが,これまで通り使っていきます。
WP_Queryのページでは,特定のカテゴリIDを含むや,タグIDを含むといったものは示されています。
カテゴリー ID が2または6の記事を表示するには、前述の cat か、または category__in(これらのカテゴリーの子カテゴリーの記事は表示されないことに注意してください)を使うことで実現します:
関数リファレンス/WP Query
$query = new WP_Query( array( ‘category__in’ => array( 2, 6 ) ) );
タグID 37 と 47 いずれかの記事を表示するには、前述の tag か、もしくは tag__in を使って明示的に特定することで実現します:
関数リファレンス/WP Query
$query = new WP_Query( array( ‘tag__in’ => array( 37, 47 ) ) );
楽ですね。
しかし,今回は,「いま表示している記事のカテゴリIDか,タグIDに関わる記事を表示する」という条件で絞り出したいです。
そこで,用いたのが「タクソノミーのパラメータ」での検索です。
やっている内容を書いてしまうと次の通りです。
上でset_query_varしたカテゴリを引き継いでいます。
$categories = get_query_var('categories');
$categoryIDs = [];
if(!empty($categories)):
foreach($categories as $category):
$categoryIDs[] = $category->cat_ID;
endforeach;
endif;
カテゴリと同様に,上でset_query_varしたタグを引き継いでいます。
$tags = get_query_var('tags');
$tagIDs = [];
if(!empty($tags)):
foreach($tags as $tag):
$tagIDs[] = $tag->term_id;
endforeach;
endif;
カテゴリID変数とタグID変数を利用して,検索用のパラメータを作ります。
$params = [
'post_type' => 'post',
"tax_query" => [
'relation' => 'OR',
[ // カテゴリID
'taxonomy' => 'category',
'field' => 'term_id',
"terms" => $categoryIDs,
],
[ // タグID
'taxonomy' => 'tag',
'field' => 'term_id',
"terms" => $tagIDs,
],
],
'post_status' => 'publish',
"posts_per_page" => 5,
"orderby" => "rand"
];
$q = new WP_Query($params);
“tax_query”配列の下で,”relation”を”OR”にしているところが重要です。
このようにして,現在,投稿のカテゴリ,またはタグをもつ記事を「関連する記事抜粋」として表示しています。
ただ,OR検索じゃなくANDに,category__inではなくcategory__andにした方が,より投稿内容にマッチした結果になるでしょうね。
今は,本当に,同じカテゴリ,タグを持つ記事をランダムに表示しているだけなので,そこまで関連性のない記事がガンガンでます。
投稿数が増え記事数がじゅうぶんになったときには,もっとうまくパラメータをつくらないといけないですね。
投稿記事のカテゴリやタグと同じ記事をランダム表示します。