Saya perlu mengurutkan (khusus) posting dengan 2 nilai bidang khusus ...
nama bidang khusus 1: is_sponsored
[nilai bisa berupa 1
atau 0
]
nama bidang khusus 2: sfp_date
[ timestamp
alias tanggal posting saat ini dalam detik]
Posting yang " is_sponsored
" nilainya 1 harus di atas, disortir berdasarkan " sfp_date
" dalam DESC
urutan akhir. Semua posting lain yang is_sponsored
nilainya "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.
sumber
Jawaban:
Oke, solusi terakhirnya adalah dengan memecah kueri:
... dan gunakan filter "posts_orderby" untuk mengubah bagian ORDER:
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":
... dan pada halaman menggunakan filter buang kueri kami:
Semoga masuk akal!
sumber
Saya menulis permintaan Anda sedikit memodifikasi. Saya harap ini bisa membantu.
Tolong beri tahu saya apakah ini berfungsi atau tidak :-)
sumber