2013-07-19 22 views
14

Używam niestandardowej pętli wyświetlać moje wydarzenia na stronie, mam to w porządku zamawiania przez zdarzenie datę rozpoczęcia używając poniżej:Jak zamówić za pomocą wielu kluczy meta?

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

ale opcja meta_key pozwala tylko jedną wartość. Jak korzystać z dwóch wartości (_event_start_date i _event_start_time)?

+0

Też tego szukam i obawiam się, że tylko WP4.0 na to pozwala. Wypróbowałem wszystkie możliwe konfiguracje parametrów zapytania bez sukcesu na 3.9 ... – Ninj

Odpowiedz

-1

Od WP_Query documentation użyć meta_query i wypełnić z tablicą meta klucz/wartości:

$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); 
+3

Ale to nie pomaga przy zamówieniu? – user1280853

+0

Nie jestem pewien, sprawdź [to zapytanie wyszukiwania] (http://wordpress.stackexchange.com/search?q=meta_query+is%3Aanswer). – brasofilo

+0

Moja odpowiedź poniżej wyjaśnia to w odniesieniu do zamawiania za pomocą wielu zapytań z kluczem meta. –

-1

można zamówić na jednym kluczu, od wielokrotności. Tak:

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

Kluczem tutaj jest to, że klucz meta_key określa, które mamy zamówieniu przez, od tych, których używamy, aby pobrać nasze dane z meta_query.

+8

Tak przydatne, jak to, że nie odpowiada na oryginalne pytanie. Odpowiada: "Jeśli zapytanie o wiele kluczy meta, w jaki sposób mogę zamówić przez pojedynczy klucz meta?" zapytano: "Wciągam posty i trzeba je zamawiać za pomocą wielu kluczy meta". –

-1

add_action('pre_get_posts', 'pre_get_posts_programpunkter'); 
 

 
function pre_get_posts_programpunkter($query) { 
 
\t 
 
\t if(!is_admin() && is_post_type_archive('programpunkt') && $query->is_main_query()) { 
 
\t \t 
 
\t \t $query->set('orderby', 'meta_value'); 
 
\t \t $query->set('meta_key', 'event-date'); 
 
\t \t \t 
 
\t \t $query->set('meta_query', array(
 
\t \t \t 'relation' => 'AND', 
 
\t \t \t \t array('key' => 'event-date', 'compare' => 'EXISTS'), 
 
\t \t \t \t array('key' => 'event-start', 'compare' => 'EXISTS') 
 
\t \t \t) 
 
\t \t); 
 
\t \t \t 
 
\t \t $query->set('order', 'ASC'); 
 
\t \t \t \t 
 
\t } 
 
} 
 

 
add_filter('posts_orderby', 'programpunkter_orderby'); 
 

 
function programpunkter_orderby($orderby) { 
 
\t 
 
\t if(get_queried_object()->query_var === 'programpunkt') { 
 
\t \t 
 
\t \t global $wpdb; \t \t 
 
\t \t $orderby = str_replace($wpdb->prefix.'postmeta.meta_value', 'mt1.meta_value, mt2.meta_value', $orderby); \t 
 
\t \t 
 
\t } \t 
 
\t return $orderby; 
 
}

+0

Podczas gdy te linki mogą odpowiedzieć na pytanie, lepiej umieścić tutaj istotne części odpowiedzi i podać odnośniki do odniesienia. Odpowiedzi dotyczące linków mogą stać się nieważne, jeśli powiązane strony się zmienią. – matsjoyce

0

Musisz użyć meta_query co dodać meta klawisze jak wszyscy mówili, ale też trzeba dostosować kolejność według funkcji.

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

I umieścić to na functions.php

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

można przeczytać więcej na http://dotnordic.se/sorting-wordpress-posts-by-several-numeric-custom-fields/

7

To jest coś, dodano wsparcie dla WordPress w 4.2: https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/

w twojej prawdopodobnie będziesz chciał zrobić coś takiego:

$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); 
+0

Był w podobnej sytuacji, w której wybrałem to rozwiązanie i działało idealnie :). Dzięki, człowieku, mój dzień ... – Raajen