Сортировка: пользовательский запрос с заказом meta_value_num THEN по заголовку

8

я пытаюсь выполнить пользовательский запрос типа записи, чтобы соответствовать следующим критериям:
сортировать фильмы сначала по годам в порядке убывания, а
затем («внутри» порядка года) по названию в алфавитном порядке.

желаемый результат:
название фильма A, 2006
название фильма Z, 2006
...
название фильма A, 1996
название фильма Z, 1996

я использую следующий код:

$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?

спасибо заранее!

Вот результирующий SQL-запрос от $GLOBALS['wp_query']->request

ВЫБОР wp_posts. *
ОТ wp_posts
       INNER JOIN wp_term_relationships
               ВКЛ (wp_posts.id = wp_term_relationships.object_id)
       INNER JOIN wp_postmeta
               ВКЛ (wp_posts.id = wp_postmeta.post_id)
где 1 = 1
       и (wp_term_relationships.term_taxonomy_id в (24))
       и wp_posts.post_type = 'movies'
       AND (wp_posts.post_status = 'publish')
       AND (wp_postmeta.meta_key = 'year')
GROUP BY wp_posts.id
ORDER BY wp_postmeta.meta_value + 0,
          wp_posts.post_title DESC 

kyii
источник

Ответы:

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
источник
оно работает! большое Вам спасибо. я изменил ASC на DESC, хотя в функции alter_order сортировал от A до Z.
kyii
ASCследует короткое замыкание; DESCдолжен сортировать ЗА.
s_ha_dum
1

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

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

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

Rarst
источник
спасибо, прежде всего. но, к сожалению, если я перевернуть значения, я получу порядок сортировки только по AZ, игнорируя meta_value_num (догадываясь из того факта, что это один и тот же порядок, независимо от того, является ли ORDER DESC или ASC)
kyii
@kyii Я не уверен, что ты подразумеваешь под "одним и тем же порядком"?
Rarst
Извините. если я переверну, как вы предложили, я получу AZ-порядок сообщений, который останется прежним, хотя я изменю order =>параметр в форме запроса ASC на DESC и обратно. поэтому я думаю, что meta_value_num не применяется. так что ваш интересный вопрос о логике взаимодействия ORDER и ORDERBY, может быть, как-то отличается? или я делаю это неправильно?
kyii
@kyii не уверен ... Я бы попытался сбросить результирующий запрос с различными комбинациями. Тем не менее, я думаю, что в конце вам нужно будет изменить SQL, эта логика слишком ограничительна для более сложных сортировок.
первое