Сортировка ORDER BY по произвольному полю

24 февр. 2016 г., 14:17:21
Просмотры: 27K
Голосов: 10

На основе примера из https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/

Я хочу модифицировать запрос

$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') );

чтобы получить все записи, где state равно 'Wisconsin' ИЛИ timezone равно 'central', отсортированные по population по убыванию

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

Пожалуйста, не задавайте один и тот же вопрос в двух разных темах :)

fischi fischi
24 февр. 2016 г. 15:14:10

Конечно - извините за это

dkatwp dkatwp
25 февр. 2016 г. 19:33:37

Это отвечает на ваш вопрос? Пользовательский запрос с сортировкой по meta_value пользовательского поля

sampi sampi
13 июн. 2020 г. 11:08:32
Все ответы на вопрос 2
0
15

Вы можете создавать группы meta_queries, применяя к ним определенные операции сравнения, и поскольку вам нужно выполнить сортировку по одному пользовательскому полю, вы можете оставить объявление сортировки посвященным только этому полю. Таким образом:

$q = new WP_Query( 
    array(
        'meta_key' => 'population', //указываем meta_key, который будет использоваться для сортировки
        'orderby' => 'meta_value', //если meta_key (population) числовой, используйте meta_value_num вместо этого
        'order' => 'DESC', //указываем направление сортировки
        'meta_query' => array(
            'relation' => 'AND', //указываем отношение между группами запросов
            array(
                'relation' => 'OR', //указываем отношение внутри этой группы запросов
                array(
                    'key' => 'state',
                    'value' => 'Wisconsin',
                ),
                array(
                    'key' => 'timezone',
                    'value' => 'central',
                )
            ),
            array(
                'key' => 'city',
                'compare' => 'EXISTS', //проверяем существование поля
            )
        )
    )           
);
24 февр. 2016 г. 15:51:20
4

Это можно сделать следующим образом:

$q = new WP_Query( array(
    'meta_query' => array(
        'relation' => 'AND', // отношение между условиями - И
        array(
            'relation' => 'OR', // вложенное отношение - ИЛИ
            'state_clause' => array(
                'key' => 'state', // ключ метаполя
                'value' => array( 'Wisconsin' ), // разрешенные значения
                'compare' => 'IN' // штат должен быть в массиве выше
            ),
            'state_clause' => array(
                'key' => 'timezone', // ключ метаполя
                'value' => 'central', // значение
                'compare' => '=' // сравнение
            ),
        ),
        'city_clause' => array(
            'key' => 'city', // ключ метаполя
            'compare' => 'EXISTS', // проверка на существование
        ), 
    ),
    'orderby' => array(
        'city_clause' => 'DESC', // сортировка по убыванию
    ),
) );
24 февр. 2016 г. 15:14:12
Комментарии

Спасибо @fischi - но у меня есть две проблемы с этим решением: 1) значение 'state_clause' в массиве meta_query перезаписывается - так что остается только последнее объявление ('timezone'), если дампнуть запрос. 2) 'relation' => 'OR' нарушает логику запроса - теперь результат это все посты, так как population существует во всех случаях (а нам нужны только те, где state равен 'Wisconsin' или timezone равен 'central'

dkatwp dkatwp
24 февр. 2016 г. 15:32:16

см. обновленный ответ.

fischi fischi
24 февр. 2016 г. 16:11:04

Спасибо! повторение 'state_clause' в массиве для ключей state и timezone не сработало - поэтому мне пришлось сделать так, как предложил @Bruno Cantuaria выше. Однако решение Бруно не работало для меня без объявления city_clause и его вызова в 'orderby'. Так что еще раз спасибо

dkatwp dkatwp
24 февр. 2016 г. 17:06:31

Без проблем. Рад помочь!

fischi fischi
24 февр. 2016 г. 17:23:19