在搜索中排除具有自定义帖子类型的分类术语

时间:2015-05-18 作者:lotech

我有一个WooCommerce类别,用于在WooCommerce的自定义帖子类型“产品”中销售的商品。我想做的是让网站搜索只返回产品帖子类型的结果,但也排除已售出商品类别。我发现的任何从搜索中排除类别的代码似乎都不起作用,但我猜这是因为它是CPT中的一个类别。

我得到的代码用于过滤搜索,直到产品CPT(在functions.php中):

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\');
有什么想法吗?

EDIT:根据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\' );

2 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

您的方法存在的问题是,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\' );

SO网友:lotech

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

结束

相关推荐

Add custom fields to search

我想添加一个自定义字段(“introduction”和“ensavoirplus”)来搜索Wordpress,但SQL代码并不精确。我不明白我是否犯了错误,或者WP不能做到这一点。但我的尝试失败了。。。我不知道为什么,因为我完全按照抄本上说的去做。这是我的代码:function recherche_avancee( $query ) { if ( !is_admin() && $query->is_search ) { $custom_fiel