2013-07-19 23 views
14

Tôi đang sử dụng một vòng lặp tùy chỉnh để hiển thị sự kiện trên một trang, tôi nhận được nó tốt đặt hàng bởi sự kiện ngày bắt đầu sử dụng dưới đây:Cách đặt hàng bằng nhiều khóa meta?

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

Nhưng tùy chọn meta_key chỉ cho phép một giá trị. Cách sử dụng hai giá trị (_event_start_date_event_start_time)?

+0

Tôi cũng đang tìm kiếm điều đó và tôi sợ chỉ WP4.0 cho phép điều này. Tôi đã thử tất cả các cấu hình có thể có của các tham số truy vấn mà không thành công trên 3.9 ... – Ninj

Trả lời

-1

Từ WP_Query documentation, sử dụng meta_query và lấp đầy với một loạt các phím meta/giá trị:

$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

Nhưng điều đó không giúp bạn đặt hàng? – user1280853

+0

Không hoàn toàn chắc chắn, hãy kiểm tra [truy vấn tìm kiếm này] (http://wordpress.stackexchange.com/search?q=meta_query+is%3Aanswer). – brasofilo

+0

Câu trả lời của tôi dưới đây làm rõ điều này, liên quan đến đặt hàng với nhiều truy vấn meta key. –

-1

Bạn có thể đặt trên một chìa khóa, nhiều. Cũng giống như vậy:

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

Mấu chốt ở đây là meta_key quy định cụ thể mà chính chúng ta đang ra lệnh bằng, trong những người chúng tôi sử dụng để lấy hồ sơ của chúng tôi với meta_query.

+8

Hữu ích như thế này, nó không trả lời câu hỏi gốc. Câu trả lời này "Nếu tôi truy vấn bằng nhiều khóa meta, làm cách nào để đặt hàng bằng một khóa meta?" những gì đã được hỏi là "Tôi đang kéo bài viết, và cần phải ra lệnh cho họ sử dụng nhiều khóa 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

Trong khi các liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp các liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu các trang được liên kết thay đổi. – matsjoyce

0

Bạn phải sử dụng meta_query tại thêm phím meta của bạn như mọi người nói, nhưng cũng có thể bạn phải tùy chỉnh trật tự theo chức năng.

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

Và đặt này trên functions.php của bạn

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

Bạn có thể đọc thêm tại http://dotnordic.se/sorting-wordpress-posts-by-several-numeric-custom-fields/

7

Đây là điều mà WordPress thêm hỗ trợ cho trong 4.2: https://make.wordpress.org/core/2015/03/30/query-improvements-in-wp-4-2-orderby-and-meta_query/

Trong của bạn trường hợp bạn có thể muốn thực hiện một việc như sau:

$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

Trong tình huống tương tự, tôi đã chọn giải pháp này và làm việc hoàn hảo :). Cảm ơn người đàn ông nó đã làm cho ngày của tôi .. – Raajen