2014-08-29 4 views
0

Я воспользовался несколькими поисковыми фильтрами для пользовательского поиска. Итак, теперь у меня есть функции поиска , которые получают сообщения по заголовку и настраиваемому полю. Но возвращаемый результат показан случайным.Результаты поиска в Wordpress по приоритету

Я хочу, чтобы вначале был показан результат поиска по названию, а затем по обычным полям . Search result

Есть ли способ сделать это?

Поиск работает отлично, нужно просто отображать их по приоритету. Вот мой код для поиска.

add_filter('posts_orderby','my_sort_custom',10,2); 
     function my_sort_custom($orderby, $query){ 
      global $wpdb; 

       if(is_search()){ 

        $orderby = $wpdb->prefix."posts.post_type DESC, {$wpdb->prefix}posts.ID ASC"; 
      } 
      return $orderby; 
     } 

function __search_by_title_only($search, &$wp_query) 
{ 
    global $wpdb; 

    if (empty($search)) 
     return $search; // skip processing - no search term in query 

    $q = $wp_query->query_vars;  
    $n = ! empty($q['exact']) ? '' : '%'; 

    $search = 
    $searchand = ''; 

    foreach ((array) $q['search_terms'] as $term) { 
     $term = esc_sql(like_escape($term)); 
     $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}') "; 
     //$searchand = ' AND '; 
    } 

    if (! empty($search)) { 
     $search = " AND ({$search}) "; 
     if (! is_user_logged_in()) 
      $search .= " AND ($wpdb->posts.post_password = '') "; 
    } 

    return $search; 
} 
add_filter('posts_search', '__search_by_title_only', 1, 2); 




function posts_join_post_meta($join, $query){ 

    global $wpdb; 

    if(is_search()){ 

     $join .= " 
     INNER JOIN 
      {$wpdb->postmeta} ON {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id"; 

    } 

    return $join; 

} 
add_filter('posts_join', 'posts_join_post_meta', 2, 2); 




function recipe_search_where($where, $query){ 

    global $wpdb; 
    if(is_search()){ 
     $where .= " OR (
     {$wpdb->postmeta}.meta_key = '_recipe_incredients' AND {$wpdb->postmeta}.meta_value LIKE ('%".$wpdb->escape(get_query_var('s'))."%')) "; 
    } 
    return $where; 
} 
add_filter('posts_where', 'recipe_search_where', 10, 2); 

ответ

1

Ваш пост только появляются случайным, потому что вы также отсортировать их по ID в этой строке {$wpdb->prefix}posts.ID ASC, попытайтесь удалить это и сортировать их только по типу записи.

Если вышеуказанный метод не работает, просто напишите свой простой SQL-запрос и выполните его. Также важное уведомление: $wpdb->escape() Функция устарела, попробуйте использовать $wpdb->prepare(), чтобы предотвратить SQL-инъекцию. Только

Пример:

$wpdb->query($wpdb->prepare(" 
    SELECT $wpdb->posts 
    INNER JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id 
    WHERE 1 = 1 
    AND $wpdb->postmeta.meta_key = %s 
    AND $wpdb->postmeta.meta_value LIKE %s 
    ORDER BY $wpdb->posts.post_type DESC 
    ", 
    '_recipe_incredients', '%'.get_query_var('s').'%') 
); 

См here для деталей.

Смежные вопросы