質問: wordPressにプラグイン「FAQ manager」を入れてFAQページを構築しております。 FAQにはメンバー用のTopic(カテゴリ)があり、メンバーの未ログイン時はFAQ検索時に メンバー用のTopic(カテゴリ)を検索対象から外し、ログイン時にそのカテゴリを 検索対象に入れる実装を検討しております。 ググってみると、wordPressの「functions.php」に以下の実装をすれば、 特定カテゴリを検索対象から外れると知り、試しに実装してみました。 ``` function SearchFilter($query) { if ( !is_admin() && $query->is_main_query() && $query->is_search() ) { $query->set('category__not_in', array(1,2));//カテゴリーIDを指定 } return $query; } add_filter('pre_get_posts','SearchFilter'); ``` 上記コードを実装したのですが、検索対象外のカテゴリが検索に引っかかります。 また、プラグイン「Search Everything」の設定に検索対象外のカテゴリIDを 登録して検索すると、登録したカテゴリIDは検索対象が外れます。 おそらく別の実装方法があると思いますので、もしご存知でしたら ご教授のほどお願いいたします。
回答: 自己解決しましたのでお知らせします。 以下のコードを「functions.php」に実装するだけです。 ``` // FAQとカテゴリを紐付ける function searchJoin($join) { if ( is_search() ) { $join = $join . "INNER JOIN wp_term_relationships ON (wp_term_relationships.object_id = wp_posts.ID)"; } return $join; } add_filter('posts_join', 'searchJoin'); // 該当カテゴリを検索条件から除外する function searchFilter($where, $query) { if ( !is_admin() && $query->is_main_query() && $query->is_search() ) { $excl_list = "除外するTopic(カテゴリ)ID (複数の場合はカンマで区切る)"; $where = $where . "AND (wp_term_relationships.term_taxonomy_id NOT IN ( " . $excl_list . " )) AND (wp_posts.post_type IN ( 'question' ))"; } return $where; } add_filter('posts_search', 'searchFilter', 10, 2); ``` ご参考になれば幸いです。