Как сделать сортировку записей по нескольким параметрам в WordPress?
Имеется тип записи, у записей много разных параметров сделанных через поля ACF.
Существуют фильтры которые подбирают записи по некоторым параметрам, но кроме этого есть поля по которым надо упорядочить отфильтрованные записи. Как пример - параметры фильтра - страна, город, район. Параметры сортировки - рейтинг, платное поднятие (галочка по сути улучшающая положение в выдаче)
Нужно после отбора через meta_query вывести записи в нужном порядке. Проблема в том что поля участвующие в сортировке в выборе через meta_query не участвуют, так как дополнительные, из за этого order_by не прокатывает.
Дополнительно
Показывайте код
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Сортировка по нескольким ACF-полям в WordPress делается через именованные условия
meta_queryи массивorderby. Главное: заранее понимать тип данных. Числа сортируйте какNUMERIC, даты храните в форматеYmdили timestamp, текстовые значения сортируйте как строки.Пример: сначала фильтруем записи, затем сортируем по приоритету, цене и дате:
$args = [ 'post_type' => 'objects', 'posts_per_page' => 20, 'meta_query' => [ 'relation' => 'AND', 'priority_clause' => [ 'key' => 'priority', 'compare' => 'EXISTS', 'type' => 'NUMERIC', ], 'price_clause' => [ 'key' => 'price', 'compare' => 'EXISTS', 'type' => 'NUMERIC', ], ], 'orderby' => [ 'priority_clause' => 'DESC', 'price_clause' => 'ASC', 'date' => 'DESC', ], ];
Если часть записей не имеет нужного поля, они могут исчезнуть из результата. В таком случае либо заполните дефолтные значения при сохранении записи, либо добавляйте более сложный
meta_queryсNOT EXISTS. Для каталога с большим числом записей сортировка по нескольким meta-полям может быть тяжёлой для MySQL. Тогда лучше вынести ключевые параметры в отдельную таблицу, использовать индексируемые поля или хотя бы хранить нормализованные числовые значения без пробелов, валют и лишнего текста.Если пользователь сам выбирает порядок сортировки в форме, не подставляйте значение напрямую в
orderby. Сделайте белый список допустимых вариантов: напримерprice_asc,price_desc,rating_desc. Каждый вариант должен разворачиваться в заранее подготовленный наборmeta_key,meta_queryиorderby. Так вы избежите SQL-мусора и неожиданных запросов. После изменения сортировки проверяйте пагинацию: параметры фильтра нужно сохранять в ссылках страниц, иначе на второй странице сортировка сбросится.