我有一个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\' );
最合适的回答,由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\' );