penyortiran meta_query dengan 2 kunci

8

Saya perlu mengurutkan (khusus) posting dengan 2 nilai bidang khusus ...

nama bidang khusus 1: is_sponsored[nilai bisa berupa 1atau 0]

nama bidang khusus 2: sfp_date[ timestampalias tanggal posting saat ini dalam detik]

Posting yang " is_sponsored" nilainya 1 harus di atas, disortir berdasarkan " sfp_date" dalam DESCurutan akhir. Semua posting lain yang is_sponsorednilainya "0 harus dicantumkan di bawah ini - dalam urutan menurun (oleh" sfp_date") juga.

Saya punya sesuatu seperti:

$sfp_query_args = array(
    'tax_query'   => array( 
        array( 
            'taxonomy' => 'sfp_posts',
            'terms'    => array( 1, 5, 8 )
        )
    ),
    'post_type'   => 'sfpposts',
    'post_status' => 'publish',
    'showposts'   => 15,
    'paged'       => $paged,
    'meta_key'    => 'sfp_date', 
    'orderby'     => 'meta_value_num', 
    'order'       => 'DESC', 
    'meta_query'  => array(
        'key'          => 'is_sponsored',
        'value'        => 2,
        'type'         => 'NUMERIC',
        'compare'      => '<='
    )
);
$wp_q = new WP_Query( $sfp_query_args );

... tapi tidak berhasil. Ada ide?


Catatan Editor: Ini adalah plugin kecil yang akan menunjukkan bagaimana kueri terlihat, karena kami mungkin tidak memiliki set data yang tersedia untuk menguji ini.

<?php
/** Plugin Name: (#67600) Dump Query parts */
function wpse67600_dump_query_parts( $pieces )
{
    echo '<pre>'.var_export( $pieces, true ).'</pre>';
    return $pieces;
}
add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' );

OP PLEASE ADD OUTPUT OF PLUGIN HERE - gunakan tautan "edit" .

EDIT oleh Dameer

OK, setelah melacak permintaan dan banyak solusi, saya telah datang dengan yang berikut ...

Jika saya menyederhanakan "$ sfp_query_args" sedikit hasilnya dekat dengan apa yang diperlukan, namun, ketidakmampuan untuk mengurutkan posting tetap apa adanya. Ini dia:

$sfp_query_args1 = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => (int)$per_page,
    'paged' => $paged,
    'meta_key' => 'is_sponsored', 
    'orderby' => 'meta_value date'
);
  • * Orderby mengambil dua atribut: meta_value dan tanggal *

Jadi permintaan $ wpdb-> dengan argumen di atas dalam kueri terlihat seperti ini:

SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID 
FROM $wpdb->posts 
INNER JOIN $wpdb->term_relationships 
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
INNER JOIN $wpdb->postmeta 
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
WHERE 1=1 
AND $wpdb->posts.post_type = 'sfpposts' 
AND ($wpdb->posts.post_status = 'publish') 
AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) 
GROUP BY $wpdb->posts.ID 
ORDER BY $wpdb->postmeta.meta_value, $wpdb->posts.post_date DESC 
LIMIT 0, $per_page

Dan akhirnya, untuk dapat mengurutkan berdasarkan meta_value juga, kueri harus ditetapkan dengan hanya satu perbedaan kecil:

SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID 
FROM $wpdb->posts 
INNER JOIN $wpdb->term_relationships 
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
INNER JOIN $wpdb->postmeta 
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
WHERE 1=1 
AND $wpdb->posts.post_type = 'sfpposts' 
AND ($wpdb->posts.post_status = 'publish') 
AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) 
GROUP BY $wpdb->posts.ID 
ORDER BY $wpdb->postmeta.meta_value [!ORDER MISSING!], $wpdb->posts.post_date DESC 
LIMIT 0, $per_page

Harap tandai placeholder [! ORDER MISSING!]. Saya kira hal di atas harus menjelaskan di mana tepatnya masalah terjadi.

Dameer
sumber
Saya tidak percaya Anda bisa melakukannya dengan kelas WP_Query default. Bahkan dalam dokumen itu tertulis "Apakah Anda tahu cara mengurutkan permintaan jika meta_value adalah array? Tulis di sini". Anda mungkin harus menulis kueri SQL Anda sendiri untuk ini.
Miha Rekar
Ya, saya tahu itu belum diselesaikan tetapi saya pikir ini adalah tempat yang tepat untuk menyelesaikannya :)
Dameer
Saya telah menambahkan sebuah plugin kecil ke pertanyaan Anda, sehingga Anda dapat menunjukkan kepada kami bagian-bagian query SQL final. Harap edit pertanyaan Anda dengan info itu. Terima kasih.
kaiser
Oh dan ini adalah beberapa info dari pertanyaan terkait tentang cara kerja sortir secara umum.
kaiser

Jawaban:

2

Oke, solusi terakhirnya adalah dengan memecah kueri:

$sfp_query_args = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
    'meta_key' => 'is_sponsored',
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => (int)$per_page,
    'paged' => $paged
);

... dan gunakan filter "posts_orderby" untuk mengubah bagian ORDER:

add_filter( 'posts_orderby', 'sfp_modify_orderby' );
function sfp_modify_orderby( $orderby ) {
    if( !is_admin() && is_tax( 'sfp_post_category' ) ) {
        global $wpdb;
        $orderby = " $wpdb->postmeta.meta_value DESC, $wpdb->posts.post_date DESC ";
    }
    return $orderby;
}

Kemungkinan besar Anda harus menghapus filter setelah loop pada halaman untuk mencegah 'posts_orderby' memengaruhi permintaan lain (sidebar atau footer). Jadi, inilah fungsi lain untuk dimasukkan ke "functions.php":

function sfp_remove_orderby_filter() {
    remove_filter( 'posts_orderby', 'sfp_modify_orderby' );
}

... dan pada halaman menggunakan filter buang kueri kami:

if( have_posts() ) : while( have_posts() ) : the_post();
    // code
endwhile;
else :
    // code
endif;

sfp_remove_orderby_filter();

Semoga masuk akal!

Dameer
sumber
-1

Saya menulis permintaan Anda sedikit memodifikasi. Saya harap ini bisa membantu.

$sfp_query_args = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_posts', 'terms' => array( 1, 5, 8) ) ),
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => 15,
    'paged' => $paged, 
    'meta_key'=>'sfp_date', 
    'meta_query' => array(
    array(
        'key' => 'sfp_date',
            'type' => 'NUMERIC',
    ),
    array(
        'key' => 'is_sponsored',
        'value' => '2',
        'compare' => '<='
    )       
    ),
    'orderby' => 'meta_value_num', 
    'order' => 'DESC',
);
$wp_q = new WP_Query( $sfp_query_args );

Tolong beri tahu saya apakah ini berfungsi atau tidak :-)

Md Toufiqul Islam
sumber
2
Ini akan mengurutkan secara default (berdasarkan tanggal), karena Anda tidak memberikan 'meta_key'.
Miha Rekar
Terima kasih @MihaRekar, itu adalah kesalahan, terima kasih atas koreksinya
Md Toufiqul Islam
Saya khawatir itu tidak berhasil, itu hanya terus menyortir posting berdasarkan tanggal tanpa menempatkan mereka yang memiliki "is_sponsored" nilai 1 ke atas.
Dameer
Saya mencari solusi untuk ini. Mungkin @MihaRekar benar. Anda mungkin harus menulis kueri sql khusus untuk ini
Md Toufiqul Islam
Apakah ada cara Anda dapat memberikan contoh permintaan mySQL "normal"?
Dameer