我正在尝试做什么
搜索产品时,搜索引擎仅查找产品信息(标题和描述)并显示它们。我正在寻找一种在查询中包含产品类别 (product_cat) 标题和描述的方法,以便我可以列出找到的类别中的所有产品。
我不想做什么
我不想显示类别,仅显示这些类别中的产品(如果在这些类别的标题或描述中找到这些术语)。
TL;博士
假设我有一个名为“宠物”的类别,其中包含名为猫、狗等的产品,但其标题或描述中没有“宠物”一词。我希望用户能够寻找宠物并在搜索结果中看到此“宠物”类别的所有产品。
到目前为止我尝试过这个
function SearchFilter($query) {
if ($query->is_search && !is_admin()) {
// Get the search query
$search_query = $query->query_vars['s'];
$query->set( 'tax_query', array(
'relation' => 'OR',
array(
'taxonomy' => 'product_cat',
'field' => 'name',
'terms' => $search_query,
'operator' => 'LIKE'
),
array(
'taxonomy' => 'product_cat',
'field' => 'description',
'terms' => $search_query,
'operator' => 'LIKE'
)
));
$query->set('post_type', array('product'));
$query->set( 'wc_query', 'product_query' );
if (isset( $_GET['showall'] ) && $_GET['showall'] == 1 ) {
$query->set( 'paged', 1 );
$query->set( 'posts_per_page', - 1 );
} else {
$query->set( 'posts_per_page', 12 );
}
}
return $query;
}
add_filter('pre_get_posts','SearchFilter');
但是好像没啥作用。根据我的发现,我的猜测是使用 posts_join、posts_where 和 post_district 过滤器首先在 Product_cat 中搜索,保存 ID,然后使用这些分类法查询产品(确保我们还显示标题中包含术语的产品/描述)。但我对此有点迷失。
通过过滤搜索查询找到了我的解决方案。希望有帮助:
function new_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .= "
INNER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id
INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->term_taxonomy}.term_taxonomy_id = {$wpdb->term_relationships}.term_taxonomy_id
INNER JOIN {$wpdb->terms} ON {$wpdb->terms}.term_id = {$wpdb->term_taxonomy}.term_id";
}
return $join;
}
add_filter('posts_join', 'new_search_join' );
function new_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_search()) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"
(".$wpdb->posts.".post_title LIKE $1)
OR
(".$wpdb->posts.".post_content LIKE $1)
OR
(".$wpdb->terms.".name LIKE $1)
OR
(".$wpdb->term_taxonomy.".description LIKE $1)
", $where );
}
return $where;
}
add_filter( 'posts_where', 'new_search_where' );
/** Prevent duplicates */
function new_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'new_search_distinct' );