Сортировка: пользовательский запрос с orderby meta_value_num THEN по названию
Я пытаюсь запустить пользовательский запрос типа post, чтобы соответствовать следующим критериям:
сортировать фильмы по годам по убыванию,
после этого («внутри» порядка года) по названию в алфавитном порядке.
желаемый результат:
название фильма A, 2006
название фильма Z, 2006
...
название фильма A, 1996
название фильма Z, 1996
i используйте следующий код:
$wp_query = new WP_Query();
$wp_query->query( array(
'post_type' => 'movies',
'distribution' => 'companyA',
'meta_key' => 'year',
'orderby' => 'meta_value_num title',
'order' => 'DESC',
'posts_per_page' => -1,
'post_status' => 'publish',
));
Я пробовал несколько вещей, но я могу получить этот «обратный» результат:
название фильма A, 1996
название фильма Z, 1996
...
название фильма A, 2006
название фильма Z, 2006
Если я изменяю DESC, ASC, это изменяет сортировку заголовков. но мне нужно применить его к году, а не к названию.
Это правильный способ использовать два значения orderby? или мне нужно использовать meta_query или пользовательский SQL?
thx заранее!
Вот результат SQL Query из $GLOBALS['wp_query']->request
ВЫБОР wp_posts. *
ОТ wp_posts
INNER JOIN wp_term_relationships
ON (wp_posts.id = wp_term_relationships.object_id)
INNER JOIN wp_postmeta
ON (wp_posts.id = wp_postmeta.post_id)
WHERE 1 = 1
AND (wp_term_relationships.term_taxonomy_id IN (24))
И wp_posts.post_type = 'кино'
И (wp_posts.post_status = 'опубликовать')
И (wp_postmeta.meta_key = 'год')
GROUP BY wp_posts.id
ORDER BY wp_postmeta.meta_value + 0,
wp_posts.post_title DESC
2 ответа
Это очень грубо, но нужно сортировать ваши сообщения по годам (meta_value), а затем по названию. Это зависит от того, как настроен запрос, поэтому он будет работать только с запросом ниже или с похожими.
function alter_order_wpse_103181($order,$qry) {
remove_filter('posts_orderby','alter_order',1,2);
$order = explode(',',$order);
$order = implode( ' ASC,',$order);
return $order;
}
add_filter('posts_orderby','alter_order_wpse_103181',1,2);
$q = new WP_Query();
$q->query( array(
'post_type' => 'movies',
'distribution' => 'companyA',
'meta_key' => 'year',
'orderby' => 'meta_value_num title',
'order' => 'ASC',
'posts_per_page' => -1,
'post_status' => 'publish',
));
var_dump($q->request);
Ваша проблема не так много с orderby
как с order
. В то время как orderby
принимает несколько значений, и ваше использование выглядит нормально, order
только принимает ASC
или DESC
После очистки order
добавляется к выходу orderby
. Если я правильно понимаю логику, это означает, что из нескольких параметров orderby
, order
будет применяться к последнему указанному.
Попробуйте изменить orderby
на 'title meta_value_num'
поэтому заголовок сортируется по умолчанию и order
применяется к году вместо заголовка.