Pesan dengan DESC, ASC di WP_Query khusus

8

Saya perlu melakukan pemesanan multi-level dalam permintaan. Masalahnya adalah dengan memesan satu nilai DESC dan ASC lainnya seperti dalam SQL. SQL berikut ini sepertinya memberikan apa yang saya inginkan ketika saya menjalankannya di terminal:

SELECT DISTINCT * FROM wp_posts 
INNER JOIN wp_postmeta 
ON wp_posts.ID = wp_postmeta.post_id 
WHERE wp_posts.post_type = 'post' 
AND wp_postmeta.meta_key = 'pb_issue_featured'
AND wp_posts.post_status = 'publish' 
ORDER BY wp_postmeta.meta_value DESC, wp_posts.menu_order ASC;

Ini pb_issue_featuredadalah nilai boolean. Hasil akhir yang saya butuhkan adalah kueri untuk menampilkan posting yang memiliki nilai meta 1 untuk bidang ini di bagian atas, lalu semua yang lain di bawah. Kemudian pemesanan tingkat kedua adalah yang ditunjuk menu_order(saya menggunakan plugin urutan jenis posting).

Masalahnya adalah bahwa nilai boolean saya perlu dipesan tinggi ke rendah (1 ke 0) tetapi menu_order sebaliknya. Apa yang dipesan terlebih dahulu dengan plugin ini memiliki urutan menu 1. Jadi menggunakan 'orderby' bawaan di WP_Query tidak berfungsi. Adakah yang punya saran? Saya melihat ke filter 'posts_orderby' tetapi tidak bisa mengambilnya. Tidak benar-benar yakin di mana itu harus diterapkan atau bagaimana saya bisa memecahkannya. Itu hanya tidak memesan kembali cara saya memilikinya.

Terima kasih untuk bantuannya! Saya akan memposting WP_Query yang sebenarnya jika relevan tetapi saya ingin membuat ini sesingkat mungkin.

Argumen kueri:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'post_status' => 'publish',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );
$q = new WP_Query($args);
ian
sumber
Nah, Anda harus memposting WP_Query, untuk melihat apakah itu benar.
Marin Bînzari
Itu semua dalam kemuliaan itu. Saya saat ini tidak memesan apa pun kecuali bahwa nilai meta boolean b / c itu adalah satu-satunya cara untuk mendapatkan tingkat itu atau menyortir bekerja. Situs ini juga menggunakan posting 'informasi utama' yang diutamakan daripada posting 'fitur'. Jadi saya mengecualikan mereka dalam query ini
ian

Jawaban:

20

Coba ini:

$args = array(
        'post_type' => 'post',
        'meta_key' => 'pb_issue_featured',
        'orderby'   => 'meta_value',
        'order' => 'DESC',
        'posts_per_page' => $posts,
        'paged' => $paged,
        'paged' => 1,
        'meta_query' => array(
            array(
                'key' => 'headline',
                'value' => 1,
                'compare' => '!=' 
                )
            )
        );

add_filter( 'posts_orderby', 'filter_query' );
$q = new WP_Query($args);
remove_filter( 'posts_orderby', 'filter_query' );

function filter_query( $query ) {
    $query .= ', wp_posts.menu_order ASC';
    return $query;
}
Marin Bînzari
sumber
Seperti bos Spartakus. Terima kasih atas jawaban singkat dan akurat. Ini bekerja seperti pesona
ian
1
Anda juga bisa menggunakan array dalam urutan dengan klausa (WP 4.0 dan yang lebih baru)
Blueriver