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.


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!


-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 :-)


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.