Sắp xếp: truy vấn tùy chỉnh với thứ tự meta_value_num THEN theo tiêu đề


8

tôi cố gắng chạy một truy vấn loại bài đăng tùy chỉnh để phù hợp với các tiêu chí sau:
sắp xếp phim theo năm theo thứ tự giảm dần,
sau đó ("bên trong" thứ tự năm) theo tiêu đề theo thứ tự bảng chữ cái.

đầu ra mong muốn:
phim tựa đề Một năm 2006
bộ phim tiêu đề Z 2006
...
phim tựa đề Một, 1996
phim tiêu đề Z, 1996

tôi sử dụng đoạn mã sau:

$wp_query = new WP_Query();
$wp_query->query( array(
'post_type' => 'movies', 
                      'distribution' => 'companyA', 
                      'meta_key' => 'year',
                      'orderby' => 'meta_value_num title',  
                      'order' => 'DESC', 
                      'posts_per_page' => -1, 
                      'post_status' => 'publish',
));

tôi đã thử một vài thứ nhưng tôi chỉ có thể nhận được kết quả "nghịch đảo" này:

tựa phim A, 1996
tựa phim Z, 1996
...
tựa phim A,
tựa phim Z, 2006

nếu tôi thay đổi DESC, ASC thì nó chỉ thay đổi cách sắp xếp tiêu đề. nhưng tôi cần phải áp dụng nó cho năm nay và không cho tiêu đề.

đó có phải là cách đúng để sử dụng hai giá trị thứ tự? hoặc tôi phải sử dụng meta_query hoặc SQL tùy chỉnh?

thx trước!

Đây là truy vấn SQL kết quả từ $GLOBALS['wp_query']->request

CHỌN wp_posts. *
TỪ wp_posts
       INNER JOIN wp_term_relationships
               ON (wp_posts.id = wp_term_relationships.object_id)
       INNER JOIN wp_postmeta
               ON (wp_posts.id = wp_postmeta.post_id)
WHERE 1 = 1
       AND (wp_term_relationships.term_taxonomy_id IN (24))
       VÀ wp_posts.post_type = 'phim'
       VÀ (wp_posts.post_status = 'xuất bản')
       VÀ (wp_postmeta.meta_key = 'năm')
NHÓM THEO wp_posts.id
ĐẶT HÀNG THEO wp_postmeta.meta_value + 0,
          wp_posts.post 

Câu trả lời:


1

Điều này rất thô sơ nhưng nên sắp xếp các bài đăng của bạn theo năm (meta_value) và sau đó theo tiêu đề. Nó phụ thuộc vào cách thiết lập truy vấn để nó chỉ hoạt động với truy vấn bên dưới hoặc với các truy vấn tương tự.

function alter_order_wpse_103181($order,$qry) {
  remove_filter('posts_orderby','alter_order',1,2);
  $order = explode(',',$order);
  $order = implode( ' ASC,',$order);
  return $order;
}
add_filter('posts_orderby','alter_order_wpse_103181',1,2);

$q = new WP_Query();
$q->query( array(
  'post_type' => 'movies', 
  'distribution' => 'companyA', 
  'meta_key' => 'year',
  'orderby' => 'meta_value_num title',  
  'order' => 'ASC', 
  'posts_per_page' => -1, 
  'post_status' => 'publish',
));
var_dump($q->request);

nó hoạt động Cảm ơn rât nhiều. tôi đã thay đổi ASC thành DESC mặc dù trong hàm notify_order để sắp xếp A thành Z.
kyii

ASCnên rút ngắn AZ; DESCnên sắp xếp ZA.
s_ha_dum

1

Vấn đề của bạn không nhiều orderbynhư với order. Mặc dù orderbychấp nhận nhiều giá trị và việc sử dụng của bạn có vẻ ổn, nhưng order chỉ chấp nhận ASC hoặc DESC .

Sau khi khử trùng orderđược thêm vào đầu ra của orderbychế biến. Nếu tôi hiểu quyền logic có nghĩa là trong số nhiều orderbytham số, ordersẽ áp dụng cho tham số cuối cùng được liệt kê.

Hãy thử đảo ngược orderbyđể 'title meta_value_num'tiêu đề được sắp xếp theo mặc định và orderáp dụng cho năm thay vì tiêu đề.


cảm ơn bạn nhưng thật không may nếu tôi đảo ngược các giá trị tôi nhận được một thứ tự sắp xếp chỉ cần AZ bỏ qua meta_value_num (đoán từ thực tế đó là cùng một thứ tự bất kể ORDER là DESC hay ASC)
kyii

@kyii Tôi không chắc ý của bạn là "cùng một thứ tự bất kể"?
Rarst

lấy làm tiếc. Nếu tôi đảo ngược như bạn đề xuất, tôi nhận được một thứ tự AZ của các bài đăng, vẫn giữ nguyên mặc dù tôi thay đổi order =>tham số trong mẫu truy vấn ASC thành DESC và quay lại. vì vậy tôi đoán meta_value_num không được áp dụng. Vì vậy, điểm thú vị của bạn về logic của sự tương tác giữa ORDER và ORDERBY có thể khác nhau? hoặc tôi đang làm sai?
kyii

@kyii không chắc chắn ... Tôi sẽ cố gắng kết xuất truy vấn với các kết hợp khác nhau. Tuy nhiên tôi nghĩ rằng cuối cùng bạn sẽ cần sửa đổi SQL, logic này quá hạn chế đối với các loại phức tạp hơn.
Rarst
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.