WordPressで検索範囲にカテゴリーやタグを含める方法

構築・開発WordPress

簡単な方法では、Search Everything というプラグインを使うのが早いと思います。

WordPress:4.9.8
Search Everything:8.1.9

ですが、今回こちらのプラグインを入れた所、不具合が発生しました。

テーマ表示側は、問題なく想定した動きになるのですが、管理画面の投稿一覧にある検索をすると、一度目は何もヒットせず、そのまま二度目の検索を行うとリストアップされるという挙動になってしまいました。

そこで、プラグインを無効にして、検索範囲拡張の部分のみを独自に実装することにしました。

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);

 

結構古い記事ですが、下記を参照させていただきました
https://memo.dogmap.jp/2012/08/27/wordpress-custom-search/

現行バージョンでも問題なく動きました。

 

※iThemes Securityなども入れていたりするので、複合的なプラグインで発生していたのかもしれません。

コメント

スポンサーリンク
タイトルとURLをコピーしました