WordPressにて,表示している記事のもつ「カテゴリ」または「タグ」を含む記事を検索する

2021年11月21日

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() の内部で呼び出される load_template() /en は、WP_Query クエリ変数をすべて extract して、読み込むテンプレートのスコープへ入れます。従って set_query_var() を使えば変数をテンプレートパーツで使えるようにできます。

関数リファレンス/get template part

しかし,WordPressのバージョンが上がって,5.5からは,set_query_varなど使わなくても,get_template_partの引数に変数を渡すことができるようです。

get_template_part( string $slug,  string $name = null,  array $args = array() )

$args
(array) (Optional) Additional arguments passed to the template. 
Default value: array()

https://developer.wordpress.org/reference/functions/get_template_part/

というわけで,set_query_varは使わなくて良いみたいですが,これまで通り使っていきます。

クエリの組み立て

WP_Queryのページでは,特定のカテゴリIDを含むや,タグIDを含むといったものは示されています。

カテゴリー ID が2または6の記事を表示するには、前述の cat か、または category__in(これらのカテゴリーの子カテゴリーの記事は表示されないことに注意してください)を使うことで実現します:

$query = new WP_Query( array( ‘category__in’ => array( 2, 6 ) ) );

関数リファレンス/WP Query

タグID 37 と 47 いずれかの記事を表示するには、前述の tag か、もしくは tag__in を使って明示的に特定することで実現します:

$query = new WP_Query( array( ‘tag__in’ => array( 37, 47 ) ) );

関数リファレンス/WP Query

楽ですね。

しかし,今回は,「いま表示している記事のカテゴリIDか,タグIDに関わる記事を表示する」という条件で絞り出したいです。

そこで,用いたのが「タクソノミーのパラメータ」での検索です。

やっている内容を書いてしまうと次の通りです。

現在のカテゴリIDを取得して変数に格納

上でset_query_varしたカテゴリを引き継いでいます。

$categories = get_query_var('categories');
$categoryIDs = [];
if(!empty($categories)):
  foreach($categories as $category):
    $categoryIDs[] = $category->cat_ID;
  endforeach;
endif;

現在のタグIDを取得して変数に格納

カテゴリと同様に,上で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にした方が,より投稿内容にマッチした結果になるでしょうね。

今は,本当に,同じカテゴリ,タグを持つ記事をランダムに表示しているだけなので,そこまで関連性のない記事がガンガンでます。

投稿数が増え記事数がじゅうぶんになったときには,もっとうまくパラメータをつくらないといけないですね。


 カテゴリ一覧

 雑談(171)
アニメ(19)/ゲーム(12)/ドラマ(3)/パソコン(36)/小説(3)/広島東洋カープ(16)/映画(11)/漫画(33)/音楽(61)
 製作記(89)
AI(4)/CakePHP(3)/CentOS(4)/JavaScript(JS)(9)/Nuxt.js(4)/Vue.js(18)/WordPress(23)/料理(10)