Как отсортировать записи сперва с заполненной датой (ближайшей), потом без даты (пустое value)?
add_action('pre_get_posts', 'custom_posts'); function custom_posts($query) { if ( ! is_admin() && $query->is_main_query() ) { $cur_date = date('Y-m-d'); $meta_query = array( 'relation' => 'OR', array( 'key' => 'date', 'value' => $cur_date, 'compare' => '>=', 'type' => 'DATE', ), array( 'key' => 'date', 'value' => '', 'compare' => '=', ), ); $query->set('meta_query', $meta_query); } } |
add_action('pre_get_posts', 'custom_posts'); function custom_posts($query) { if ( ! is_admin() && $query->is_main_query() ) { $cur_date = date('Y-m-d'); $meta_query = array( 'relation' => 'OR', array( 'key' => 'date', 'value' => $cur_date, 'compare' => '>=', 'type' => 'DATE', ), array( 'key' => 'date', 'value' => '', 'compare' => '=', ), ); $query->set('meta_query', $meta_query); } }
в данном запросе выводятся не просроченные относительно текущей даты записи по ключу date формат value 2023-04-20, а также выводятся записи, для которых value пустое (ключа date).
каким образом отсортировать записи, сперва ближайшие по дате, потом без даты
Дополнительно:
Ответы:
В meta query делаем ассоциативные записи,
А в orderby передаем массив ключей выше
- Если не получится с вашим случаем , то остаётся вариант https://developer.wordpress.org/reference/hooks/po...
- Если будете хукать orderby через sql - вам вероятно понадобится FIELD()
- это как ассоциативные записи можно пример?
- William,
‘first_meta’ => array(
'key' => 'date',
'value' => $cur_date,
'compare' => '>=',
'type' => 'DATE',
),
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Вам нужно разделить записи на две группы: сначала записи с заполненной датой, отсортированные по ближайшей дате, затем записи без даты. Одним обычным
orderby => meta_valueэто часто не получается аккуратно сделать, потому что пустые значения и отсутствующие meta_key сортируются не так, как нужно.Если поле
dateхранится в форматеY-m-d, можно использовать именованные условияmeta_queryи сортировку:add_action('pre_get_posts', function ($query) { if (is_admin() || !$query->is_main_query()) { return; } $cur_date = current_time('Y-m-d'); $query->set('meta_query', [ 'relation' => 'OR', 'future_date' => [ 'key' => 'date', 'value' => $cur_date, 'compare' => '>=', 'type' => 'DATE', ], 'empty_date' => [ 'key' => 'date', 'value' => '', 'compare' => '=', ], 'no_date' => [ 'key' => 'date', 'compare' => 'NOT EXISTS', ], ]); $query->set('orderby', [ 'future_date' => 'ASC', 'date' => 'DESC', ]); });
Но у такого варианта есть нюанс: WordPress SQL не всегда идеально сортирует пустые и отсутствующие значения после дат. Если нужно строго «сначала все с датой, потом все без даты», надёжнее добавить отдельное служебное поле, например
has_date: 1 для записей с датой и 0 для пустых. Тогда сортировка становится простой.$query->set('meta_key', 'date'); $query->set('orderby', [ 'meta_value' => 'ASC', ]);
Для сложной сортировки можно использовать фильтр
posts_orderbyи написать SQL сCASE WHEN, но это уже менее универсально. Если проект живой и таких записей много, я бы сделал нормализацию данных: у всех записей естьdateиhas_date, а сортировка строится по этим двум предсказуемым полям.