Сортировка результатов AJAX-поиска
Всем привет.
Делали на сайте AJAX-поиск по товарам. Столкнулись с такой проблемой, что вводя короткое слово (например, ель), которое встречается в названиях других товаров, то сначала выводятся другие товары, а уже потом только "Ели". Поиск делали по этому уроку
Для наглядности ситуации. Есть ли возможность сначала выводить товары с полным совпадением в начале товара, а уже все остальные?
Как происходит выборка у нас сейчас.
$arg = array(
'post_type' => array('product'),
'orderby'=> array('type'=>'DESC', 'title'=>'ASC'),
'post_status' => 'publish',
'product_cat' => $category,
's' => convert_english_letters($_POST['s']),
'meta_query' => array(
array(
'key' => '_stock_status',
'value' => 'instock'
)
)
);
Ответы (1 шт):
Автор решения: Darth KYL
→ Ссылка
вам нужно использовать фильтры запроса posts_where для изменения условия поиска только по заголовку и posts_orderby для изменения условия сортировки.
add_filter( 'posts_where', 'change_search_query', 10, 2 );
function change_search_query( $where, $query ){
global $wpdb;
if ( ! is_admin() && $query->is_main_query && $query->is_search ) {
$where = " AND {$wpdb->posts}.post_title LIKE '%{$wpdb->esc_like( $query->get( 's' ) ) }%'";
}
return $where;
}
add_filter( 'posts_orderby', 'change_order_by_query', 10, 2 );
function change_order_by_query( $orderby, $query ) {
global $wpdb;
if ( ! is_admin() && $query->is_main_query() && $query->is_search ) {
$orderby = " CASE WHEN {$wpdb->posts}.post_title = '{$query->get( 's' )}' THEN 1 ELSE 2 END ASC";
}
return $orderby;
}
