Как сделать сортировку записей по нескольким параметрам в WordPress?

Ссылка скопирована
1 ответ

Имеется тип записи, у записей много разных параметров сделанных через поля ACF.
Существуют фильтры которые подбирают записи по некоторым параметрам, но кроме этого есть поля по которым надо упорядочить отфильтрованные записи. Как пример - параметры фильтра - страна, город, район. Параметры сортировки - рейтинг, платное поднятие (галочка по сути улучшающая положение в выдаче)
Нужно после отбора через meta_query вывести записи в нужном порядке. Проблема в том что поля участвующие в сортировке в выборе через meta_query не участвуют, так как дополнительные, из за этого order_by не прокатывает.

Дополнительно

Показывайте код

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ирина WP Ответ

Сортировка по нескольким 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',
    ],
];

$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-мусора и неожиданных запросов. После изменения сортировки проверяйте пагинацию: параметры фильтра нужно сохранять в ссылках страниц, иначе на второй странице сортировка сбросится.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно