У меня проблемы с сортировкой наивысших постов на моем сайте 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;
}