Задать вопрос
@awenn2015
Веб-разработчик самоучка

Как сортировать записи по двум полям в sql запросе, обычному и произвольному без фильтрации?

Вот что пока что пришло в голову:

SELECT wp_posts.ID, wp_posts.post_title, wp_postmeta.meta_value FROM wp_posts
LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'pinned'
WHERE wp_posts.post_type  = 'partners' 
# AND wp_postmeta.meta_key = 'pinned' 
# ORDER BY wp_posts.post_date DESC LIMIT 25
ORDER BY IF(wp_postmeta.meta_value, CAST(wp_postmeta.meta_value AS UNSIGNED), wp_posts.post_date) ASC, wp_posts.post_date DESC
LIMIT 25


В решении основывался на варианте с wp-kama но без обертки над WP_Query так как она оказалась не рабочей, так что пошел думать как это реализовать на чистом SQL запросе,

Суть задачи собственно какая, нужно отсортировать записи по дате и произвольному полю "pinned" но без самой фильтрации (что get_posts / WP_Query почему то не умеют делать и фильтруют записи даже если не указывать meta_value, меня такое не особо устраивает), нюансы сортировки, сначала должны выводиться закрепленные записи в ASC (хотя в теории не особо критично, главное что бы шли первые) в после уже остальные "не закрепленные" по дате (или любому другому полю в ASC/DESC, текущий вариант не позволяет так делать
  • Вопрос задан
  • 459 просмотров
Подписаться 2 Простой 22 комментария
Пригласить эксперта
Ответы на вопрос 1
@awenn2015 Автор вопроса
Веб-разработчик самоучка
А все, в phpmyadmin на тыкал по колонкам как нужно, даже и думать не пришлось и получился такой вариант

SELECT wp_posts.ID, wp_posts.post_title, wp_posts.post_date, wp_postmeta.meta_value FROM wp_posts 
LEFT JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = 'pinned' 
WHERE wp_posts.post_type = 'partners' 
ORDER BY `wp_postmeta`.`meta_value` DESC, `wp_posts`.`ID` DESC LIMIT 25


Хоть он конечно и не покрывает 100% задачу так как тут сортировка все равно общая какая то получается, мы сначала поднимает закрепленные а потом сортируем всё по ID, хотелось бы иметь возможность сортировать отдельно поднятые и все остальные по разному

============ UPDATED ============

За два дня поисков нашел еще такой вариант, в целом тоже работает и отвечает на 1-ую часть задания, тут я уже сам себе признал что так себе знал о всех доступных способах указания аргументов в WP_Query, так как до этого в основном пользовался только стандартными кейсами

$posts_query = new WP_Query([
  'paged' => $paged,
  'post_type' => 'post',
  'post_status' => 'publish',
  'suppress_filters' => true,
  'posts_per_page' => $posts_per_page,
  'meta_query' => [
    'relation' => 'OR',
    'pinned_clause' => [
      'key' => 'pinned',
      'compare' => 'EXISTS',
    ],
  ],
  'orderby' => [
    'pinned_clause' => 'DESC',
    'ID' => 'DESC',
  ],
]);


Осталось найти способ как выполнить 2-ую часть задания, хотя предполагаю что можно где то в цикле после того как отрисовал закрепленные менять query параметр orderby на нужный, главное отловить тот момент когда идут не закрепленные, наверно по кол-ву можно брать, заранее посчитать сколько всего закрепленных и после в цикле уже проверять

Далее по всей видимости нужно изучать как делать сложные meta_query что бы комбинировать relation по типу этого

$post_query = new WP_Query([
  // ...
  'meta_query' => [
    'relation' => 'AND',
    [
      'relation' => 'OR',
      'pinned_clause' => [
        'key' => 'pinned',
        'compare' => 'EXISTS',
      ],
    ],
    [
      'relation' => 'AND',
      [
        'key' => 'acf_field_1',
        'value' => 'filtering_value_1',
      ],
      [
        'key' => 'acf_field_2',
        'value' => 'filtering_value_2',
      ],
    ],
  ],
]);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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