Сортировка по нескольким произвольным полям и их значениям

16 нояб. 2016 г., 11:20:53
Просмотры: 43.6K
Голосов: 23

Как можно настроить сортировку по нескольким произвольным полям (meta keys) и их значениям, может кто-нибудь привести пример?

2
Комментарии

Добро пожаловать на WPSE - чтобы мы могли вам помочь, вам нужно помочь нам. Не могли бы вы подробнее описать, что вы пытаетесь сделать, и, возможно, привести примеры кода.

TheDeadMedic TheDeadMedic
16 нояб. 2016 г. 11:44:21

Я не понимаю, почему это было закрыто или запрошена дополнительная информация - вопрос предельно ясный, понятный и с правильными тегами...

jave.web jave.web
10 июн. 2021 г. 13:07:09
Все ответы на вопрос 1
5
49

meta_query — это массив мета-условий. Например:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
) );

Вы можете использовать ассоциативный массив с ключами для каждого мета-условия:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'state_clause' => array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
) );

Затем эти ключи можно использовать в аргументе order_by с одним условием:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'state_clause' => array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => 'city_clause', // Результаты будут отсортированы по значениям метаполя 'city'.
) );

Или с несколькими условиями:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND',
        'state_clause' => array(
            'key' => 'state',
            'value' => 'Wisconsin',
        ),
        'city_clause' => array(
            'key' => 'city',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => array( 
        'city_clause' => 'ASC',
        'state_clause' => 'DESC',
    ),
) );

Пример взят из этой записи в блоге Make WordPress Core.

16 нояб. 2016 г. 11:45:28
Комментарии

не забудьте указать тип мета-ключа/значения. Это повлияет на результаты. По умолчанию WordPress обрабатывает ваши метаданные как строку.

Alexander Ivashchenko Alexander Ivashchenko
12 дек. 2018 г. 13:54:03

Но что если я хочу получить не только результаты по штату Висконсин? Мне нужны все штаты, включая строки, где город может быть или не быть указан, с сортировкой по этим двум полям. То есть вообще без WHERE - только ORDER BY.

Felix Eve Felix Eve
9 мая 2019 г. 12:40:14

Феликс, при таких требованиях можно использовать обходное решение - добавить завершающий "ловущий всё" пункт в ваш meta_query и поместить его последним в порядке сортировки. Первые несколько условий в meta_query будут получать конкретные результаты, которые вы хотите видеть в начале. А последнее условие будет включать всё, что не попало под предыдущие условия.

Matt Keys Matt Keys
2 окт. 2020 г. 22:30:13

EXISTS — это отличный способ получить сложный именованный мета-запрос, но при этом не фильтровать по значению :) Кстати: у меня был реальный кейс — нужно было отсортировать события по дате DESC, но по времени ASC, используя одно поле даты&времени. Я использовал документацию и этот ответ, чтобы построить это: https://ideone.com/RUoyZs :-)

jave.web jave.web
10 июн. 2021 г. 14:23:17

Вау, это очень интересно

user2128576 user2128576
5 мар. 2022 г. 09:00:37