Как сделать заказ по нескольким мета-ключам?

Я использую собственный цикл для отображения своих событий на странице, я отлично упорядочиваю его по дате начала события, используя следующее:

$args = array( 
    'post_type' => 'event',
    'order' => 'ASC',
    'orderby' => 'meta_value',
    'meta_key' => '_event_start_date');
$loop = new WP_Query( $args );

Но опция meta_key допускает только одно значение. Как использовать два значения (_event_start_date и _event_start_time)?


person user1280853    schedule 19.07.2013    source источник
comment
Я также ищу это, и я боюсь, что это разрешено только WP4.0. Я безуспешно пробовал все возможные конфигурации параметров запроса на 3.9...   -  person Ninj    schedule 23.09.2014


Ответы (5)


Это то, что WordPress добавил поддержку в версии 4.2: https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/

В вашем случае вы, вероятно, захотите сделать что-то вроде этого:

$args = array(
    'post_type'  => 'event',
    'meta_query' => array(
        'relation' => 'AND',
        'event_start_date_clause' => array(
            'key'     => '_event_start_date',
            'compare' => 'EXISTS',
        ),
        'event_start_time_clause' => array(
            'key'     => '_event_start_time',
            'compare' => 'EXISTS',
        ), 
    ),
    'orderby' => array(
        'event_start_date_clause' => 'ASC',
        'event_start_time_clause' => 'ASC',
    ),
);

$loop = new WP_Query( $args );
person Wes Moberly    schedule 20.02.2016
comment
Был в похожей ситуации, когда я выбрал это решение и работал отлично :). Спасибо, чувак, это сделало мой день.. - person Raajen; 20.05.2016

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

$args = array(
    'post_type' => 'event',
    'meta_key' => '_event_start_date',
    'meta_query' => array(
        array('key' => '_event_start_date'),
        array('key' => '_event_start_time')
    ),
);

add_filter('posts_orderby','customorderby');
$loop = new WP_Query( $args );
remove_filter('posts_orderby','customorderby');

И поместите это в свои functions.php

function customorderby($orderby) {
    return 'mt1.meta_value ASC, mt2.meta_value ASC';
}

Вы можете прочитать больше на http://dotnordic.se/sorting-wordpress-posts-by-several-numeric-custom-fields/

person Kiyan    schedule 23.11.2015

Из документации по WP_Query используйте meta_query и заполните массив метаключей/значений:

$args = array(
    'post_type' => 'product',
    'meta_query' => array(
        array(
            'key' => 'color',
            'value' => 'blue',
            'compare' => 'NOT LIKE'
        ),
        array(
            'key' => 'price',
            'value' => array( 20, 100 ),
            'type' => 'numeric',
            'compare' => 'BETWEEN'
        )
    )
);
$query = new WP_Query( $args );
person brasofilo    schedule 19.07.2013
comment
Но это не поможет с заказом, не так ли? - person user1280853; 19.07.2013
comment
Не совсем уверен, проверьте этот поисковый запрос. - person brasofilo; 19.07.2013
comment
Мой ответ ниже поясняет это в отношении заказа с несколькими метаключевыми запросами. - person Wes Johnson; 13.11.2013

Вы можете заказать как на один ключ, так и на несколько. Вот так:

        $events = get_posts(array(
           'post_type' => 'my_event',
           'post_status' => 'publish',
           'meta_query' => array(
               array(
                   'key'    =>  'my_event_type',
                   'value'  =>  'aGoodOne'
               ),

               array(
                   'key'    =>  'my_event_start',
                   'value'  =>  time(), // in this case, only grabbing upcoming events
                   'compare'=>  '>',
                   'type'   =>  'NUMERIC' //  assuming value is unix timestamp
               )
           ),
           'meta_key'   =>  'my_event_start', // we're sorting on the start time key
           'orderby'    =>  'meta_value_num', // it's a numeric value
           'order'      =>  'ASC' // in chrono order
        ));

Ключевым моментом здесь является то, что meta_key указывает, по какому ключу мы упорядочиваем из тех, которые мы используем для получения наших записей с помощью meta_query.

person Wes Johnson    schedule 12.11.2013
comment
Как бы это ни было полезно, оно не отвечает на исходный вопрос. Это отвечает. Если я запрашиваю несколько мета-ключей, как мне сделать заказ по одному мета-ключу? меня спросили, что я загружаю посты и мне нужно упорядочивать их, используя несколько мета-ключей. - person Tom J Nowell; 07.02.2014

person    schedule
comment
Хотя эти ссылки могут дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылки для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанные страницы изменятся. - person matsjoyce; 14.02.2015