2015-04-06 2 views
0

У меня проблемы с сортировкой наивысших постов на моем сайте WordPress.Как сортировать по столбцам SQL в WordPress?

Я хотел бы сортировать и отображать самые высокие забитые сообщения (rating_full), которые также имеют наибольшее количество голосов (rating_count).

Оба типа: LongString.

Сортировка Пример:

Бизнес-4 имеет рейтинг 4.5/5 - 3 голосов
Бизнес-2 имеет рейтинг 4.5/5 - 1 голосов
Бизнес-1 имеет рейтинг 3.5/5 - 2 голосов

в кодовых областях, представляющих интерес:

оценка OrderBy является раздел я обеспокоен в коде.

($orderby == 'rating') 

Оценка баллов за пост в коде «rating_full». (Масштаб 1 до 5)

подсчета голосов на пост в коде «rating_count» (Количество голосов)

Оба типа: LongString

Вот изображение из Структура базы данных и данные: http://s22.postimg.org/wojlwqlz5/database.png

Вот мой код ниже. Я замечаю, что моя сортировка не всегда сортирует сообщения в порядке, основанном на rating_full. Я не знаю, почему. Я не пытался реализовать счетчик DESC, поскольку я не уверен.

// Sorting 
add_filter('posts_join', 'directorySortingJoin',10,2); 
function directorySortingJoin($join, $query) { 
global $wpdb, $aThemeOptions; 
    if ($query->is_main_query() && !$query->is_admin && ((isset($_GET['dir- search'])) || (isset($query->query_vars["ait-dir-item-category"])) ||   (isset($query->query_vars["a-dir-item-location"])))) { 
    $sql = ""; 
    // default ordering 
    $orderby = (isset($aThemeOptions->directory->defaultOrderby)) ? $aThemeOptions->directory->defaultOrderby : 'post_date'; 
    // get from get parameters 
    if (!empty($_GET['orderby'])) { 
     $orderby = $_GET['orderby']; 
    } 
    if ($orderby == 'rating') { 
     $sql .= " LEFT JOIN {$wpdb->postmeta} rating ON ({$wpdb->posts}.ID = rating.post_id AND rating.meta_key IN ('rating_full'))"; 
    } 
    if ($orderby == 'packages') { 
     directorySaveUserPackagesToDb(); 
     $sql .= " LEFT JOIN {$wpdb->usermeta} packages ON ({$wpdb- >posts}.post_author = packages.user_id AND packages.meta_key IN ('dir_package'))"; 
    } 
    if (isset($aThemeOptions->directory->showFeaturedItemsFirst)) { 
     $sql .= " LEFT JOIN {$wpdb->postmeta} featured ON ({$wpdb->posts}.ID = featured.post_id AND featured.meta_key IN ('dir_featured'))"; 
    } 
    $join .= $sql; 
    } 
return $join; 
    } 
    add_filter('posts_orderby', 'directorySortingOrderby',10,2); 
    function directorySortingOrderby($orderby, $query) { 
global $wpdb, $aThemeOptions; 
if ($query->is_main_query() && !$query->is_admin && ((isset($_GET['dir- search'])) || (isset($query->query_vars["a-dir-item-category"])) ||  (isset($query->query_vars["a-dir-item-location"])))) { 
    $sql = ""; 
    // default ordering 
    $orderby = (isset($aThemeOptions->directory->defaultOrderby)) ?  $aThemeOptions->directory->defaultOrderby : 'post_date'; 
    $order = (isset($aThemeOptions->directory->defaultOrder)) ? $aThemeOptions->directory->defaultOrder : 'DESC'; 
    // get from get parameters 
    if (!empty($_GET['orderby'])) { 
     $orderby = $_GET['orderby']; 
    } 
    if (!empty($_GET['order'])) { 
     $order = $_GET['order']; 
    } 
    if ($orderby == 'rating') { 
     if (isset($aThemeOptions->directory->showFeaturedItemsFirst)) { 
      $sql = "featured.meta_value DESC, convert(rating.meta_value, decimal) {$order}"; 
     } else { 
      $sql = "convert(rating.meta_value, decimal) {$order}"; 
     } 
    } else if ($orderby == 'packages') { 
     if (isset($aThemeOptions->directory->showFeaturedItemsFirst)) { 
      $sql = "featured.meta_value DESC, packages.meta_value {$order}"; 
     } else { 
      $sql = "packages.meta_value {$order}"; 
     } 
    } else { 
     if (isset($aThemeOptions->directory->showFeaturedItemsFirst)) { 
      $sql = "featured.meta_value DESC, {$wpdb->posts}.{$orderby} {$order}"; 
     } 
    } 
    $orderby = $sql; 
     } 
    return $orderby; 
     } 

ответ

0

Я нашел проблему! вместо использования был использован конверт.

$ sql = "convert (rating.meta_value, decimal) {$ order}";

$ sql = "cast (rating.meta_value как десятичный (10,2)) {$ order}";

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