web-dev-qa-db-ja.com

カスタムの投稿タイプを持つ分類の用語を検索から除外する

私はWooCommerceのカスタム投稿タイプ 'product'の中に販売済みアイテムのWooCommerceカテゴリを持っています。私がやろうとしているのは、サイト検索で商品の投稿タイプからの結果のみを返すようにし、販売済みの商品カテゴリも除外するようにすることです。検索からカテゴリを除外するように思われるコードは機能しないようですが、それはCPT内のカテゴリだからだと思います。

私はフィルタリングのために私が持っているコードは(functions.phpに)ちょうど製品のCPTに検索を絞り込みます:

function mySearchFilter($query) {
    $post_type = $_GET['type'];
    if (!$post_type) {
        $post_type = 'product';
    }
    if ($query->is_search) {
        $query->set('post_type', $post_type);
    };
    return $query;
};

そして私がカテゴリを除外しようとしたコード:

function remove_categories_wp_search($query) {
if ($query->is_search) {
    $query->set('cat','-247');
}
    return $query;
}
add_filter('pre_get_posts','remove_categories_wp_search');

何か案は?

編集: 私はまた試したialocinの提案に従って:

function wpse188669_pre_get_posts( $query ) {
    if ( 
        ! is_admin() 
        && $query->is_main_query() 
        && $query->is_search() 
    ) {
        // set your parameters according to
        // https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
        $tax_query = array(
            // likely what you are after
            'taxonomy' => 'sold-gallery',
            'operator' => 'NOT IN',
        );
        $query->set( 'tax_query', $tax_query );
  }
}
add_action( 'pre_get_posts', 'wpse188669_pre_get_posts' );
3
lotech

あなたのアプローチの問題は、woocommerces製品カテゴリがproduct_catと呼ばれるカスタム分類法であるということです。しかしcatを使用すると、組み込みカテゴリに対処しています。分類法は tax query で簡単に記述できます。

function wpse188669_pre_get_posts( $query ) {
    if ( 
        ! is_admin() 
        && $query->is_main_query() 
        && $query->is_search() 
    ) {
        $query->set( 'post_type', array( 'product' ) );
        // set your parameters according to
        // https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
        $tax_query = array(
            array(
                // likely what you are after
                'taxonomy' => 'product_cat',
                'field'    => 'slug',
                'terms'    => 'sold-gallery',
                'operator' => 'NOT IN',
            ),
        );
        $query->set( 'tax_query', $tax_query );
  }
}
add_action( 'pre_get_posts', 'wpse188669_pre_get_posts' );
4
Nicolai

iolocin、私はあなたの編集した答えを取り、Pieter Goosenが述べたように、それが配列の中の配列であり、コーデックスに従ってであることを確認しました。最終作業コード

function wpse188669_pre_get_posts( $query ) {
    if ( 
        ! is_admin() 
        && $query->is_main_query() 
        && $query->is_search() 
    ) {
        $tax_query = array(
            'post_type' => 'product',
            'tax_query' => array(
                array(
                    'taxonomy' => 'product_cat',
                    'field' => 'slug',
                    'terms' => 'sold-gallery',
                    'operator' => 'NOT IN',
                ),
            ),
        );
        $query->set( 'tax_query', $tax_query );
  }
}
add_action( 'pre_get_posts', 'wpse188669_pre_get_posts' );
1
lotech