Penyortiran: kueri khusus dengan orderby meta_value_num LALU berdasarkan judul

8

saya mencoba menjalankan kueri jenis kiriman khusus agar sesuai dengan kriteria berikut:
urutkan film pertama berdasarkan tahun dalam urutan menurun,
setelah itu ("di dalam" urutan tahun) berdasarkan judul menurut abjad.

output yang diinginkan:
judul film A,
judul film 2006 Z, 2006
...
judul film A,
judul film 1996 Z, 1996

saya menggunakan kode berikut:

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

saya mencoba beberapa hal tetapi saya hanya bisa mendapatkan hasil "terbalik" ini:

judul film A,
judul film 1996 Z, 1996
...
judul film A, 2006
judul film Z, 2006

jika saya mengubah DESC, ASC itu hanya mengubah pengurutan judul. tetapi saya harus menerapkannya pada tahun ini dan bukan pada gelar.

apakah ini cara yang tepat untuk menggunakan dua nilai orderby? atau apakah saya harus menggunakan meta_query atau custom SQL?

terima kasih sebelumnya!

Berikut adalah SQL Query yang dihasilkan dari $GLOBALS['wp_query']->request

SELECT wp_posts. *
FROM 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)
MANA 1 = 1
       AND (wp_term_relationships.term_taxonomy_id IN (24))
       DAN wp_posts.post_type = 'film'
       AND (wp_posts.post_status = 'publish')
       AND (wp_postmeta.meta_key = 'year')
KELOMPOK OLEH wp_posts.id
ORDER BY wp_postmeta.meta_value + 0,
          wp_posts.post_title DESC 

kyii
sumber

Jawaban:

1

Ini sangat kasar tetapi harus mengurutkan posting Anda berdasarkan tahun (meta_value) dan kemudian berdasarkan judul. Itu tergantung pada bagaimana kueri diatur sehingga hanya akan bekerja dengan kueri di bawah ini atau dengan yang serupa.

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);
s_ha_dum
sumber
berhasil! Terima kasih banyak. saya mengubah ASC ke DESC meskipun dalam fungsi alter_order untuk mengurutkan A ke Z.
kyii
ASCharus menyingkat AZ; DESCharus mengurutkan ZA.
s_ha_dum
1

Masalah Anda tidak sebanyak dengan orderbydengan order. Meskipun orderbymenerima beberapa nilai dan penggunaan Anda tampak ok, order hanya menerima ASC atau DESC .

Setelah sanitasi orderditambahkan ke output orderbypengolahan. Jika saya memahami hak logika yang berarti bahwa dari beberapa orderbyparameter, orderakan berlaku untuk yang terakhir terdaftar.

Cobalah membalikkan orderbyuntuk 'title meta_value_num'judul sehingga diurutkan secara default dan orderberlaku untuk tahun bukan judul.

Jarang
sumber
terima kasih, jarang. tetapi sayangnya jika saya membalikkan nilai-nilai saya mendapatkan semacam urutan hanya AZ mengabaikan meta_value_num (menebak dari fakta bahwa itu adalah urutan yang sama terlepas jika ORDER adalah DESC atau ASC)
kyii
@kyii Saya tidak yakin apa yang Anda maksud dengan "urutan yang sama terlepas"?
Jarang
Maaf. jika saya membalikkan seperti yang Anda sarankan saya mendapatkan urutan AZ dari posting, yang tetap sama meskipun saya mengubah order =>parameter dalam bentuk permintaan ASC ke DESC dan kembali. jadi saya kira meta_value_num tidak diterapkan. jadi poin menarik Anda tentang logika interaksi ORDER dan ORDERBY mungkin berbeda? atau saya salah melakukannya?
kyii
@kyii tidak yakin ... Saya akan mencoba membuang kueri yang dihasilkan dengan kombinasi yang berbeda. Namun saya pikir Anda perlu memodifikasi SQL pada akhirnya, logika ini terlalu ketat untuk jenis yang lebih kompleks.
Jarang