Сортировка: пользовательский запрос с 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

7 голосов | спросил kyii 16 J0000006Europe/Moscow 2013, 23:58:18

2 ответа


1

Это очень грубо, но нужно сортировать ваши сообщения по годам (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);
ответил s_ha_dum 17 J0000006Europe/Moscow 2013, 04:38:50
1

Ваша проблема не так много с orderby как с order. В то время как orderby принимает несколько значений, и ваше использование выглядит нормально, order только принимает ASC или DESC

После очистки order добавляется к выходу orderby. Если я правильно понимаю логику, это означает, что из нескольких параметров orderby, order будет применяться к последнему указанному.

Попробуйте изменить orderby на 'title meta_value_num' поэтому заголовок сортируется по умолчанию и order применяется к году вместо заголовка.

ответил Rarst 17 J0000006Europe/Moscow 2013, 02:06:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132