WordPressでカテゴリー、タグ、カスタムタクソノミーを検索対象に含める方法

WordPressでカテゴリー、タグ、カスタムタクソノミーを検索対象に含める方法

Photo Gary Bendig via Unsplash

カテゴリーやタグ、カスタムタクソノミーを検索対象に含める方法を紹介します。

実装は簡単です。下記のコードをfunctions.phpに追加します。

function atom_search_where($where){
  global $wpdb;
  if (is_search())
    // COLLATE utf8_unicode_ciで「ひらがな」と「カタカナ」、「全角英数」と「半角英数」を区別しないでマッチさせる
    $where .= "OR (t.name COLLATE utf8_unicode_ci LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')";
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

これで、記事のカテゴリー、タグ、カスタムタクソノミーを検索対象に含めることができるようになります。

「ひらがな」と「カタカナ」、「全角英数」と「半角英数」を区別しないでマッチさせるようにしてあります。

参考

Include custom taxonomy term in search – WordPress Development Stack Exchange