Как заказать несколько мета ключей?
Я использую настраиваемый цикл для отображения моих событий на странице, я получаю его точное упорядочение по дате начала события, используя ниже:
$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
)?
Ответы
Ответ 1
Это то, что 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 );
Ответ 2
Вы должны использовать 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');
И поставьте это на свои функции. php
function customorderby($orderby) {
return 'mt1.meta_value ASC, mt2.meta_value ASC';
}
Вы можете прочитать больше на http://dotnordic.se/sorting-wordpress-posts-by-several-numeric-custom-fields/
Ответ 3
Из документации 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 );
Ответ 4
Вы можете заказать один ключ из нескольких. Например:
$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 a numeric value
'order' => 'ASC' // in chrono order
));
Ключевым моментом здесь является то, что meta_key
указывает, какой ключ мы заказываем, из тех, которые мы используем, чтобы захватить наши записи с помощью meta_query
.
Ответ 5
add_action( 'pre_get_posts', 'pre_get_posts_programpunkter' );
function pre_get_posts_programpunkter( $query ) {
if( !is_admin() && is_post_type_archive( 'programpunkt' ) && $query->is_main_query() ) {
$query->set( 'orderby', 'meta_value' );
$query->set( 'meta_key', 'event-date' );
$query->set( 'meta_query', array(
'relation' => 'AND',
array( 'key' => 'event-date', 'compare' => 'EXISTS' ),
array( 'key' => 'event-start', 'compare' => 'EXISTS' )
)
);
$query->set( 'order', 'ASC' );
}
}
add_filter('posts_orderby', 'programpunkter_orderby');
function programpunkter_orderby( $orderby ) {
if( get_queried_object()->query_var === 'programpunkt' ) {
global $wpdb;
$orderby = str_replace( $wpdb->prefix.'postmeta.meta_value', 'mt1.meta_value, mt2.meta_value', $orderby );
}
return $orderby;
}