ЧТО Я ПЫТАЮСЬ СДЕЛАТЬ
При поиске продукта поисковая система ищет только информацию о продукте (название и описание) и отображает ее. Я ищу способ включить в запрос заголовок и описание категории продуктов (product_cat), чтобы я мог перечислить все продукты из найденных категорий.
ЧЕГО Я НЕ ХОЧУ ДЕЛАТЬ
Я не хочу отображать категории, только товары в этих категориях, если термины встречаются в названии или описании этих самых категорий.
ТЛ;ДР
Допустим, у меня есть категория «Домашнее животное» с товарами под названием «кошка», «собака» и т. д., но без термина «домашнее животное» ни в названии, ни в описании. Я бы хотел, чтобы пользователь мог искать домашнее животное и видеть все продукты из этой категории «домашнее животное» в результатах поиска.
До сих пор я пробовал это
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, сохранить идентификаторы, а затем запросить продукты с этими таксономиями (убедившись, что мы также отображаем продукты с терминами в их названии). описание). Но я немного растерялся в этом.
Ой ! Верно. Что мне следует сделать, чтобы включить описание в налоговый запрос?
Нашел свое решение, отфильтровав поисковый запрос. Надеюсь, это поможет:
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' );
Обратите внимание, что
'field' => 'description',
не может работать, поскольку параметр «поле» не допускает значения «описания» в WP_Query с параметрами таксономии