Bagaimana cara query_post menggunakan meta_query ke orderby meta_key DAN memiliki jenis sekunder berdasarkan tanggal?

8

Saya telah memecahkan masalah selama beberapa hari terakhir dan terus berputar. Bisa benar-benar menggunakan sepasang mata baru untuk membantu saya menjawab pertanyaan ini ...

Jadi saya bekerja dengan situs wordpress di mana posting memiliki beberapa bidang khusus yang relevan dengan permintaan yang saya perlu jalankan: "post-expired" dan "my-sort-order". Ketika saya menjalankan query_posts saya ingin hasilnya menjadi tulisan di mana "pasca kadaluwarsa" BUKAN "ya" (bagian ini berfungsi dalam kode saya). Saya juga ingin hasil diurutkan berdasarkan nilai angka DESC dari "pesanan-saya-urutan" (berfungsi juga) DAN jika ada ikatan pada "pesanan-saya-urutan", saya ingin mengurutkan berdasarkan tanggal dengan posting terbaru pertama.

Urutan sekunder menurut tanggal adalah tempat saya mengalami masalah.

Ini kode yang saya miliki sekarang:

<?php               
$args = array(
    'paged' => $paged,
    'meta_query'=> array(
        array(
            'key'=>'post-expired',
            'value'=> 'yes',
            'compare' => '!='
        )
    ),
    'meta_key'=>'my-sort-order',
    'orderby'=>'meta_value_num', 
    'order'=>'DESC'
);

$args = array_merge( $args , $wp_query->query );

query_posts( $args );
?>

Dengan menggunakan kode di atas, saya dengan benar mendapatkan kembali posting yang tidak kedaluwarsa dan mereka diurutkan berdasarkan urutan-saya menurun (yaitu 100 muncul sebelum 99, dll). Tetapi jika kedua posting memiliki nilai urutan sortir yang sama, ada beberapa jenis sortir sekunder yang terjadi, sepertinya saya tidak bisa mengendalikannya (dan tidak tahu apa yang sebenarnya sedang diurutkan).

Gagasan pertama saya untuk menyelesaikan ini adalah hanya menambahkan nilai ke "urutan-saya-urutan" jika saya ingin menetapkan urutan urutan tertentu untuk posting itu. Saya pikir jika nilai untuk bidang ini dibiarkan kosong untuk sisa posting, mereka hanya akan dikembalikan secara default berdasarkan tanggal DESC (setelah posting dengan urutan pengurutan tertentu). Namun, apa yang sebenarnya terjadi adalah setiap pos yang tidak memiliki set nilai urutan pesanan TIDAK dikembalikan sama sekali ...

Selanjutnya, saya mencoba menambahkan beberapa nilai di bidang orderby seperti ini:

('orderby'=>'meta_value_num date')

Itu benar-benar meledakkan kedua jenis pesanan yang saya tuju dan mengembalikan posting dengan cara yang tidak terduga. Saya mendapat kesan bahwa beberapa nilai orderby diizinkan, tetapi untuk beberapa alasan itu tidak berfungsi di sini.

Pada titik ini saya tidak yakin bagaimana cara membuat salah satu dari solusi potensial ini bekerja. Adakah yang tahu bagaimana saya dapat 1) Mengurutkan posting berdasarkan bidang "pesanan saya" terlebih dahulu, kemudian minta entri yang tersisa tanpa nilai di bidang tersebut dikembalikan dengan pengurutan tanggal default; atau 2) Mencari tahu bagaimana mengontrol urutan orderby sekunder sehingga setiap tulisan yang memiliki ikatan pada "pesanan-saya" akan diurutkan berdasarkan tanggal (terbaru lebih dulu)?

Dana
sumber

Jawaban:

2

Mudah-mudahan Anda sudah menemukan ini sekarang, tetapi jika belum, Anda harus dapat menggunakan filter "posts_orderby" untuk memanggil dalam urutan tertentu untuk permintaan Anda. Saya tidak akan memberikan solusi lengkap di sini, tetapi Anda dapat merujuk ke posting ini untuk lebih lanjut: http://mitcho.com/blog/how-to/external-orders-in-wordpress-queries/

EDIT:

Inilah Dokumentasi - pada dasarnya Anda bisa mengganti klausa ORDER BY SQL: http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby

Dan inilah contoh kode dari dokumen:

add_filter('posts_orderby', 'edit_posts_orderby');
add_filter('posts_join_paged','edit_posts_join_paged');

function edit_posts_join_paged($join_paged_statement) {
$join_paged_statement = "LEFT JOIN wp_gdsr_data_article gdsra ON gdsra.post_id = wp_posts.ID";
return $join_paged_statement;   
}

function edit_posts_orderby($orderby_statement) {
$orderby_statement = "(gdsra.user_votes_total_sum/gdsra.user_votes_count) DESC";
return $orderby_statement;
}
tollmanz
sumber
Ya, filter posts_orderby adalah yang Anda cari. Saya akan mengedit jawaban dengan kode pada tautan itu ...
mltsy