Lọc theo một trường tùy chỉnh, theo thứ tự khác?


10

Tôi có một loại bài đăng tùy chỉnh "Danh sách" và tôi muốn nhận tất cả các Danh sách có trường tùy chỉnh gateway_value != 'Yes'và sắp xếp kết quả theo trường tùy chỉnh khác , location_level1_value. Tôi có thể làm cho các truy vấn hoạt động riêng lẻ, nhưng tôi không thể kết hợp chúng:

Truy vấn 1 (sắp xếp theo vị trí):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );

Truy vấn 2 (giá trị trường tùy chỉnh! = Có):

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_key' => 'gateway_value',
                    'meta_value' => 'Yes',
                    'meta_compare' => '!=',
                    'paged' => $paged
                    )
                );

Truy vấn kết hợp:

Tôi đã xem codex để được giúp đỡ về vấn đề này, nhưng truy vấn sau không hoạt động:

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_query' => array(
                        array(
                            'key' => 'gateway_value',
                            'value' => 'Yes',
                            'compare' => '!='
                        ),
                        array(
                            'key' => 'location_level1_value'
                        )
                    ),
                    'orderby' => "location_level1_value",
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                );

Tôi đang làm gì sai với truy vấn kết hợp?

[CẬP NHẬT]: Vì vậy, bây giờ 3.1 đã được phát hành, truy vấn kết hợp ở trên vẫn không hoạt động. Tôi nhận được kết quả, chỉ là không được sắp xếp chính xác.

[CẬP NHẬT]: var_dump($wp_query->request)đưa ra những điều sau:
string(527) " SELECT SQL_CALC_FOUND_ROWS wp_7v1oev_posts.* FROM wp_7v1oev_posts INNER JOIN wp_7v1oev_postmeta ON (wp_7v1oev_posts.ID = wp_7v1oev_postmeta.post_id) INNER JOIN wp_7v1oev_postmeta AS mt1 ON (wp_7v1oev_posts.ID = mt1.post_id) WHERE 1=1 AND wp_7v1oev_posts.post_type = 'listing' AND (wp_7v1oev_posts.post_status = 'publish') AND wp_7v1oev_postmeta.meta_key = 'gateway_value' AND CAST(wp_7v1oev_postmeta.meta_value AS CHAR) != 'Yes' AND mt1.meta_key = 'location_level1_value' ORDER BY wp_7v1oev_posts.post_date DESC LIMIT 0, 9"


3
Bạn đang sử dụng WordPress 3.1? Các meta_querytham số là mới trong 3.1, dự kiến sẽ được phát hành rất sớm, nhưng phiên bản ổn định hiện nay vẫn là 3.0.5, mà không cần tham số này.
Jan Fabry

Er ... đúng, đó có thể là lý do tại sao sau đó. Bất kỳ cách nào để làm cho nó hoạt động trong 3.0.5?
gillespieza

Miljenko có câu trả lời tốt nhất bạn nên chấp nhận của anh ấy thay vì của bạn.
Hugo

Câu trả lời:


9

Bạn có thể sử dụng truy vấn để lọc nội dung như bạn dự định bằng cách sử dụng 'meta_query' với các tùy chọn lọc và đối với phần đặt hàng, chỉ cần thêm / sửa đổi các tham số sau:

  • 'orderby' => 'meta_value'
  • 'meta_key' => 'location_level1_value'
  • 'đặt hàng' => 'ASC'

    $wp_query = new WP_Query( array (
        'post_type'      => 'listing',
        'posts_per_page' => '9',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'       => 'gateway_value',
                'value'     => 'Yes',
                'compare'   => '!='
            )
        ),
        'orderby'  => 'meta_value',            // this means we will be using a selected 
                                               // meta field to order
    
        'meta_key' => 'location_level1_value', // this states which meta field 
                                               // will be used in the ordering, 
                                               // regardless of the filters
        'order'    => 'ASC',
        'paged'    => $paged
        )
    );
    

2

Giống như Jan đã nói trong WordPress 3.1 mới, bạn có thể sử dụng meta_querynhưng cho đến khi nó xuất hiện, bạn có thể sử dụng truy vấn đầu tiên của mình để đặt hàng và lọc bên trong vòng lặp của mình như vậy:

 Global $my_query;
$my_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );
while ($my_query->have_posts){
    $my_query->the_post();
              //do your loop stuff
} 

và thêm mã này vào hàm.php của bạn

   //join filter
         add_filter('posts_join', 'listing_join_865' );
         function listing_join_865($join){
Global$ my_query;            
if ('listing' = $my_query->query['post_type']){
                $restriction1 = 'gateway_value';
                return $join .="
                LEFT JOIN $wpdb->postmeta AS $restriction1 ON(
                $wpdb->posts.ID = $restriction1.post_id
                AND $restriction1.meta_key = '$restriction1'
                )";
             }else {
                return $join;
            }
         }
         //where filter
         add_filter('posts_where', 'listing_where_865' );
         function listing_where_865($where){
             global $my_query;
            if ('listing' = $my_query->query['post_type']){
                return $where.= " AND $restriction1.meta_value != 'yes'";
            }else{
                return $where;
            }
         }

Bây giờ điều này sẽ làm việc.


Cảm ơn vì điều đó. Điều này hoạt động, ngoại trừ tôi có tác dụng phụ kỳ lạ này là phân trang của tôi không hoạt động đúng nữa. Thay vì 9 trên mỗi trang, tôi có "các điểm trống" trong lưới của mình, nơi các bài đăng tùy chỉnh gateway_value == "Yes"sẽ có mà không có điều kiện ... Bạn có ý tưởng nào về cách khắc phục điều đó không?
gillespieza

vâng, điều đó sẽ làm rối tung phân trang nên tôi đoán cách duy nhất xung quanh nó sẽ là một truy vấn sql tùy chỉnh, hãy cho tôi vài phút.
BaiNET

Đừng lo lắng - Tôi sẽ chỉ sử dụng truy vấn thứ hai và sử dụng plugin wordpress.org/extend/plugins/post-types-order cho đến khi 3.1 được phát hành :)
gillespieza

chết tiệt, tôi vừa trở lại để xem bình luận của bạn sau khi tìm ra giải pháp. dù sao nó ở đây cho những người hỏi trong tương lai.
BaiNET

1
@ t31os - Tôi thường làm vậy nhưng không trả lời từ điện thoại di động.
BaiNET

1

Xin lỗi vì đã trả lời câu hỏi của riêng tôi:

Nhìn vào [http://core.trac.wordpress.org/ticket/15031[[1], có vẻ như đây là một vấn đề được biết đến. Tôi đã sửa (bị hack?) Nó hoạt động bằng cách sử dụng post_filter, như vậy (chỉ dành cho bất kỳ ai tham khảo có thể đang tìm kiếm cùng một câu trả lời):

Trong hàm.php ###

add_filter('posts_orderby', 'EV_locationl1' );
function EV_locationl1 ($orderby) {
    global $EV_locationl1_orderby;
    if ($EV_locationl1_orderby) $orderby = $EV_locationl1_orderby;
    return $orderby;
}

Đã sửa đổi wp_query trong tệp mẫu ###

$EV_locationl1_orderby = " mt1.meta_value ASC";

$wp_query = new WP_Query( array (
    'post_type' => 'listing',
    'posts_per_page' => '9',
    'post_status' => 'publish',
    'meta_query' => array(
            array(
                    'key' => 'gateway_value',
                    'value' => 'Yes',
                    'compare' => '!='
                    ),
            array(
                    'key' => 'location_level1_value'
            )
        ),
    'order' => $EV_locationl1_orderby,
    'paged' => $paged
    ));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.