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は検索対象が外れます。

おそらく別の実装方法があると思いますので、もしご存知でしたら  
ご教授のほどお願いいたします。
CC BY-SA 3.0
2015-05-13T07:56:28.463
10111
2015-05-14T06:20:49.533
9561
question
php wordpress
wordPressのプラグイン「FAQ manager」の特定Topic(カテゴリ)を検索対象から外す方法
自己解決しましたのでお知らせします。  
以下のコードを「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);
    
```

ご参考になれば幸いです。
CC BY-SA 3.0
2015-05-14T06:20:49.533
10163
2015-05-14T06:20:49.533
9561
10111
answer