Saya punya wp_query berikut:
$args = array(
'post_type' => 'news',
'orderby' => 'meta_key',
'order' => 'ASC',
'meta_key'=>'custom_author_name',
'post_per_page'=>-1
);
$query = new WP_Query($args);
echo $query->found_posts;
gema = 10 hasil karena hanya ada 10 news
posting dengan a meta_key = custom_author_name
. Tetapi ada ratusan news
posting yang tidak memiliki baris post_meta dengan meta_key tertentu. Harap perhatikan, bahwa tidak ada meta_query yang terlibat. Tidak ada meta_value yang ditetapkan, karena saya hanya mencoba mengurutkan posting berdasarkan meta_key, dan tidak memfilter berdasarkan meta_value.
Bukankah seharusnya Orderby memilih semua posting? dan hanya memesannya?
Jika demikian mengapa hasilnya disaring? Jika meta_key tidak ditemukan, mengapa tidak menggunakan string kosong saja, atau cocokkan semua?
Jika tidak, mengapa tidak?
Jika saya memasukkan meta_key ke setiap posting berita (meskipun itu adalah string kosong) maka saya mendapatkan hasil yang diharapkan. Tapi itu sepertinya banyak baris tabel yang tidak perlu ada di sana.
sumber
'orderby' => 'meta_value'
, itu mengubah urutan, tetapi tidak ada hubungannya dengan bidang meta yang sebenarnya.Saya mencoba menerapkan jawaban @Manny Fleurmond dan menyukai @Jake saya tidak bisa membuatnya bekerja bahkan setelah memperbaiki kesalahan ketik yang
'orderby' => 'meta_key'
seharusnya'orderby' => 'meta_value'
. (Dan untuk kelengkapannya seharusnya'posts_per_page'
tidak'post_per_page'
tetapi itu tidak mempengaruhi masalah yang sedang dilihat.)Jika Anda melihat kueri SQL yang sebenarnya dihasilkan oleh jawaban @Manny Fleurmond (setelah memperbaiki kesalahan ketik) inilah yang Anda dapatkan:
Ini menggambarkan cara WP mem-parsing kueri vars: itu membuat tabel untuk setiap klausa meta_query, kemudian mencari cara untuk bergabung dengan mereka dan apa yang harus dipesan. Pemesanan akan berfungsi dengan baik jika Anda hanya menggunakan satu klausa dengan
'compare' => 'EXISTS'
, tetapi bergabung dengan'compare' => 'NOT EXISTS'
klausa kedua dengan ATAU (karena kami harus) mengacaukan pemesanan. Hasilnya adalah LEFT JOIN digunakan untuk bergabung dengan klausa / tabel pertama dan klausa / tabel kedua - dan cara WP menyatukan semuanya berarti bahwa tabel yang dibuat menggunakan'compare' => 'EXISTS'
sebenarnya diisi dengan meta_values dari bidang kustom APA PUN, bukan hanya'custom_author_name'
bidang yang kami minati. Jadi saya pikir memesan dengan klausa / tabel itu hanya akan memberikan hasil yang diinginkan jika post_type khusus dari 'berita' hanya memiliki satu bidang khusus.Solusi yang bekerja untuk situasi saya adalah memesan dengan klausa lain / tabel - yang TIDAK ADA. Tampaknya kontra-intuitif, saya tahu, tetapi karena cara WP mem-parsing kueri vars inilah tabel ini tempat
meta_value
dihuni hanya oleh bidang kustom yang kita kejar.(Satu-satunya cara saya menemukan ini adalah dengan menjalankan yang setara dengan permintaan ini untuk kasus saya:
Yang saya lakukan adalah mengubah kolom yang ditampilkan dan menghapus klausa GROUP BY. Ini kemudian menunjukkan kepada saya apa yang sedang terjadi - bahwa kolom postmeta.meta_value menarik nilai dari semua meta_keys, sedangkan kolom mt1.meta_value hanya menarik meta_values dari bidang kustom berita.)
Solusinya
Seperti yang dikatakan @Manny Fleurmond, ini adalah klausa pertama yang digunakan untuk orderby, jadi jawabannya adalah dengan menukar babak klausa, dengan memberikan ini:
Atau Anda dapat membuat array asosiatif klausa dan memesan dengan kunci yang sesuai, seperti:
sumber
custom_author_name
diset dan kemudian tidak disetel, itumeta_key
akan meresponsEXISTS
dan efeknya adalah mereka akan digelembungkan di samping postingan yang memiliki acustom_author_name
. Dalam kasus saya, saya memiliki kotak centang jadi saya menggunakan"value" => "1"
bukanEXISTS
, tetapi string akan membutuhkan pendekatan yang berbeda.Sebenarnya itu cara kerjanya.
Jika Anda ingin melakukannya tanpa menambahkan baris tabel, Anda harus melakukan dua kueri. Satu dengan meta_key yang memiliki hasil terbatas, dan lainnya yang mendapat seluruh daftar; kemudian gunakan PHP untuk membandingkan dua hasil permintaan (mungkin menghapus hasil meta_key dari permintaan lain untuk menghapus duplikat, atau apa pun yang masuk akal dalam pengaturan Anda).
sumber
Sayangnya, itu bukan cara
WP_Query
kerjanya. Segera setelah Anda menambahkan komponen "meta" itu, Anda telah membuat semacam filter. Buang$query->request
dan Anda akan melihat apa yang saya maksud.Kedua, sama
WP_Query
sekali tidak mendukung pemesanan dengan kunci meta . Anda dapat memesan dengan nilai meta untuk kunci tertentu tetapi tidak dengan kunci itu sendiri. Sekali lagi, buang permintaan untuk melihat apa yang saya maksud. Anda akan melihat bahwa komponen "pesanan" keluar jika Anda mencoba.Menurut saya, cara paling bersih untuk menjalankannya adalah beberapa filter pendek:
sumber