Saya telah memodifikasi pencarian WP bawaan menggunakan pre_get_posts
filter, yang memungkinkan pengguna untuk mengurutkan posting (termasuk banyak jenis posting khusus) berdasarkan bidang yang berbeda.
Masalah yang saya alami adalah ketika saya memberi tahu WP untuk mengurutkan berdasarkan nilai meta, itu akan mengecualikan semua posting yang tidak memiliki set nilai meta itu. Ini menyebabkan jumlah hasil berubah jika Anda mengubah pengurutan dari katakan "Harga" ke "Tanggal" karena "Posting" tidak memiliki set "Harga" tetapi "Item" lakukan.
Ini bukan yang saya inginkan, jadi saya ingin tahu apakah ada cara untuk memasukkan SEMUA posting - bahkan yang tidak memiliki nilai meta yang saya sortir - dan menempatkan yang tanpa nilai terakhir.
Saya tahu cara menyortir lebih dari satu bidang tetapi itu tidak membantu.
Terima kasih
Sepertinya saya bukan satu-satunya dengan pertanyaan ini: Cara untuk memasukkan posting baik dengan & tanpa meta_key tertentu dalam args untuk wp_query? tapi tidak ada solusi di sana.
Memperbarui
Saya sudah mencoba jawabannya tetapi tidak yakin apakah saya mengerti dengan benar, inilah yang saya miliki sekarang:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
Nilai meta adalah angka (digunakan untuk menyimpan harga seperti namanya)
Perbarui 2
Saya sudah berkomentar soal pesanan dan yang saya miliki sekarang adalah ini:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
Dengan kode ini kueri tampaknya mengembalikan semua posting yang tidak memiliki item_price
kunci dan tidak ada posting yang memilikinya. Yaitu masalah sekarang terbalik.
Jika saya menambahkan kode-urutan juga saya mendapatkan 0 hasil.
Sunting: ... tiga tahun kemudian ... : PI mengalami masalah ini lagi. Saya mencoba semua jawaban yang diberikan dan tidak ada yang berhasil. Tidak yakin mengapa beberapa orang tampaknya berpikir mereka bekerja tetapi setidaknya mereka tidak bekerja untuk saya.
Solusi yang akhirnya saya gunakan adalah save_post
filter - memastikan semua posting memiliki bidang khusus yang ingin saya urutkan. Agak menyebalkan saya harus melakukannya, tetapi selama Anda melakukannya sejak dini, Anda mungkin tidak akan memiliki masalah.
Dalam hal ini saya sedang membangun "penghitung tampilan" pada posting dan ingin pengguna dapat mengurutkan pada posting yang paling banyak dibaca. Sekali lagi, postingan yang belum pernah dilihat (saya rasa itu tidak mungkin - tetapi masih) menghilang ketika mengurutkan pada jumlah tampilan. Saya menambahkan sedikit kode ini untuk memastikan semua posting memiliki jumlah tampilan:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
dan tax_query
yang selalu merupakan array( array() )
karena mereka menggabungkan beberapa array. Kedua - seperti yang disebutkan dalam jawaban saya - Anda harus menggunakan meta_value_num
angka. Mungkin diperlukan untuk benar-benar mendefinisikan meta_value_num
(lihat WP_Query
entri halaman -Codex). Terakhir, itu tidak masuk akal untuk order
masuk ASC
dan DESC
arah. Itu tidak mungkin. Pembatas ruang hanya berfungsi untuk orderby
dan Anda tidak bisa mengatakannya untuk mengurutkan yang pertama ASC
dan yang kedua DESC
. Itulah gunanya posts_clauses
filter.
meta_value_num
entri Anda adalah bilangan real . Terlihat terlalu sering bahwa seseorang menyatakan bahwa itu adalah angka, tetapi sebenarnya menyimpannya sebagai string dalam database.
ASC DESC
adalah agar ia bisa mengurutkan di meta_value
dalam ASC
dan di date
dalam DESC
, sejauh yang saya tahu itu berhasil.