【WordPress】サイト内検索にカテゴリー名、タグ名を検索条件に追加する

WordPressの標準でのサイト内検索では、『投稿ページ』と『固定ページ』のタイトルと本文、抜粋が検索対象になっているため、カテゴリーなどは検索の対象ではありません。そこで、こちらでは、検索範囲を カテゴリー名、タグ名と広げる方法の備忘録になります。

functions.phpに以下のものをする

/**
 * サイト内検索の範囲に、カテゴリー名、タグ名、を含める
 */
function custom_search($search, $wp_query) {
global $wpdb;
 
//サーチページ以外だったら終了
if (!$wp_query->is_search)
 return $search;

if (!isset($wp_query->query_vars))
 return $search;
 
// タグ名・カテゴリ名も検索対象に
$search_words = explode(' ', isset($wp_query->query_vars['s']) ? $wp_query->query_vars['s'] : '');
 if ( count($search_words) > 0 ) {
   $search = '';
   foreach ( $search_words as $word ) {
     if ( !empty($word) ) {
       $search_word = $wpdb->escape("%{$word}%");
       $search .= " AND (
           {$wpdb->posts}.post_title LIKE '{$search_word}'
           OR {$wpdb->posts}.post_content LIKE '{$search_word}'
           OR {$wpdb->posts}.ID IN (
             SELECT distinct r.object_id
             FROM {$wpdb->term_relationships} AS r
             INNER JOIN {$wpdb->term_taxonomy} AS tt ON r.term_taxonomy_id = tt.term_taxonomy_id
             INNER JOIN {$wpdb->terms} AS t ON tt.term_id = t.term_id
             WHERE t.name LIKE '{$search_word}'
           OR t.slug LIKE '{$search_word}'
           OR tt.description LIKE '{$search_word}'
           )
       ) ";
     }
   }
 }
 
 return $search;
 }
 add_filter('posts_search','custom_search', 10, 2);

pre_get_posts で 検索結果のクエリーをカスタマイズ

//pre_get_posts で 検索結果のクエリーに条件を追加
function change_posts_paging($query) {

// 管理画面やメインクエリーでない場合は除外
 if ( is_admin() || ! $query->is_main_query() ) {
   return;
 }
 // 検索結果ページ
 if ( $query->is_search() ) {
    // 公開されてる記事のみ検索
    $query->set( 'post_status', 'publish' );
    // 投稿のみ検索
    $query->set( 'post_type', 'post' );
    // 表示したくないカテゴリーID
    $query->set( 'category__not_in', 1 );
    // 表示したくない投稿ID。arrayで複数指定可。
    $query->set( 'post__not_in', array( 1, 2, 3, 4, 5 ) );
    // 検索結果の表示順
    $query->set( 'order', 'DESC' );
   return;
  }
 }
 add_action( 'pre_get_posts', 'change_posts_paging' );

//投稿タイプを追加する場合は、array 型で記述します。
//カスタムポストタイプ(ex. music )を含む場合もここに追加します。
//$query->set( 'post_type', array( 'post', 'page', 'music' ) );

参考

WordPress のサイト内検索をプラグインなしでカスタマイズする方法 - デザイナーのタネあかし
サイト内検索を拡張してくれる有名プラグインもあるのですが、今回は functions.php に記述して検索条件をカスタマイズする方法をご紹介します。
pre_get_postsでメインクエリを制御する | Tips Note by TAM
TAM のテクニカルチームがお届けする WEB技術ブログ!
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query

検索の結果で、警告が出た場合

参考 : https://www.wp-master.club/warning-use-of-undefined-constant

タイトルとURLをコピーしました