Saya mencoba menunjukkan semua properti sewaan, pertama oleh semua properti yang belum disewa, dan kemudian oleh semua properti yang saat ini disewa. Ada jenis pos ubahsuaian 'sewa' dengan meta pos ubahsuaian untuk harga yang disewa (_price_rented) yang merupakan kotak centang (mengembalikan baik benar atau salah ... benar jika HAS telah disewa). Saya perlu mengubah kueri untuk menampilkan semua properti dengan properti yang tersedia (tidak disewa) muncul terlebih dahulu dan kemudian properti sewaan muncul.
Ini pertanyaan saya:
$ts_properties = new WP_Query(
array(
'post_type' => 'rent',
'paged' => $paged,
'posts_per_page' => -1,
'meta_key' => '_price_rented',
'orderby' => 'meta_value',
'order' => 'DESC',
'meta_query' => array(
array(
'key' => '_price_rented',
'value' => false,
'type' => 'BOOLEAN',
),
)
)
);
Untuk beberapa alasan, kueri ini menunjukkan semua properti yang telah disewa. Ketika saya mengalihkan nilai dari 'false' ke 'true' di meta_query, ia tidak menampilkan properti apa pun.
Jadi, kemudian saya berpikir, nilai pengembaliannya salah (untuk properti yang disewa) atau NULL (untuk properti yang TIDAK disewa), tetapi saya tidak yakin bagaimana cara meminta hasil NULL (bukan salah), saya menambahkan ' bandingkan 'argumen dengan meta_query dan tetapkan nilainya ke'! = 'tetapi itu juga tidak berhasil.
EDIT: var_dump mengembalikan yang berikut untuk apartemen yang tersedia, tidak disewa: string(0) ""
dan untuk apartemen yang tidak tersedia, disewa,:string(1) "1"
sumber
_price_rented
sebenarnya ditetapkan untuk keduanyatrue
danfalse
nilai - nilai, atau hanya ditetapkan untuktrue
? Tolong periksa databasenya. Saya bertanya karena kotak centang tidak dicentang sama sekali tidak melewatiPOST
jadi saya bertanya-tanya apakah nilai ditetapkan sama sekali untuk kasus-kasus itu.Jawaban:
WP_Meta_Query
adalah bagian yang "tidak begitu stabil" dalam inti dan jika Anda tidak terlalu memperhatikan hal itu dapat dengan mudah pecah dari kebingungan.Saat Anda melakukan
new WP_Query()
dan memilikimeta_query => array()
argumen atau pasangan kunci / nilainya setara, lalunew WP_Meta_Query()
melompat, langsung diikuti dengan penguraian.Nilai yang diizinkan
Saat Anda menanyakan data meta, maka ada
bool
opsi. Dan jika Anda akan menggunakannya, maka itu akan kembali keCHAR
, yang nilai defaultnya sebagai array dari nilai yang diizinkan adalah:di mana
NUMERIC
akan diatur ulang keSIGNED
.Debugging
Ada banyak filter yang dapat memengaruhi proses penyimpanan pasca, jadi hal pertama yang harus dilakukan adalah memeriksa nilai yang berbeda di dalam beberapa loop:
Kemudian, tergantung pada nilai balik, Anda harus menggunakan
SIGNED
, jika hasilnya0
atau1
,"true"
atau"false"
jika hasilnya berupa string. Jika itu benar-benar boolean, maka saya masih menyarankan untuk menggunakanstring
hanya untuk memastikan itu lulus$GLOBALS['wpdb']
, yang hanya dapat melewati%s
string dan%d
digit.catatan tambahan
Seperti yang saya baru saja diperbarui entri Codex untuk
WP_Meta_Query
hari ini, saya melihat bahwa sana sudah banyak output yang berbeda (menambahkan jumlah banyak tidak dibutuhkanJOINS
, yang dibahas pada Tracsinidan di sini dengankeluarsatu patch pindah ke inti) mungkin. (Tiket tindak lanjut untukAND
bagian - bagian di sini ) Poinnya adalah memungkinkan untuk menggunakan kombinasimeta_*
argumen di sampingmeta_query
array dan sub-arraynya. Hasilnya hampir tidak diketahui kecuali Anda membuangnya, jadi IMHO Anda lebih baik menggunakan salah satu atau cara lain untuk menambahkan input. Terutama bila Anda hanyamenggunakanmeta_key
, karena ini menghasilkan "permintaan kunci saja" dalam beberapa kasus.Larutan
Seperti yang ditunjukkan dalam komentar:
Sekarang
meta_query
harus digunakanJika Anda ingin mendapatkan apartemen "tidak tersedia, sewaan" atau gunakan
'!='
untuk mengambil apartemen "non-sewaan".Catatan: Nilai yang mungkin untuk
meta_compare
are'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP'
atau'RLIKE'
. Nilai default adalah'='
.sumber
Saya menghadapi masalah yang sama dan setelah satu jam pencarian menemukan
"NOT EXISTS"
dan"EXISTS"
nilai( only in WP >= 3.5 )
. Jadi tidak perlu meminta nilai meta cukup periksa apakah meta_key ada:Ini bekerja dengan baik untuk saya.
sumber
Keterangan lebih lanjut:
Ada dua masalah representasi data yang terjadi di sini: satu adalah nilai data mana yang digunakan untuk mewakili benar / salah dan yang lainnya adalah apakah lapangan disimpan atau tidak sama sekali jika itu adalah nilai default (biasanya salah).
Bagian 1: Saya melihat SQL yang dihasilkan oleh
WP_Meta_Query
untuk perbandingan benar dan salah, dan menemukan bahwa untuk benar itu menggantikan '1' dan untuk false '' (string kosong). Jadi, apa pun yang Anda tulis ke dalam basis data harus setuju dengan itu jika Anda akan melakukan kueri yang membandingkan nilai benar dan salah yang sebenarnya. Khususnya, Anda tidak ingin menulis '0' untuk false. Mungkin lebih mudah untuk menulis dan menguji 0 dan 1 sebagai gantinya (dan banyak pembangun formulir melakukan itu). Tetapi periksa untuk melihat apa yang sedang ditulis ke database dan ingatlah itu ketika membangun permintaan Anda.Bagian 2: Dengan asumsi bahwa false adalah nilai default, menemukan catatan yang nilainya benar mudah:
... 'meta_key' => 'my_key', 'meta_value' => 1
(atau benar)Tetapi pihak lain menantang: mungkin ada nilai yang salah, atau mungkin tidak ada nilai sama sekali. Ini bisa terjadi jika nilai terdaftar sebagai opsional dalam formulir --- maka selama pengguna tidak secara eksplisit mengatur atau mengubahnya, itu tidak akan ditambahkan ke database. Perhatikan bahwa jika Anda hanya menggunakannya
get_post_meta
akan berfungsi dengan baik seperti ini: mengembalikan nilai yang salah dan mengembalikan tidak ada nilai akan mencapai hal yang sama.Tetapi ketika Anda menggunakan
WP_Query
, itu tidak mudah. (Atau jika ya, saya belum tahu caranya).Anda memiliki dua (atau mungkin tiga) opsi:
Pastikan bidang selalu diinisialisasi secara eksplisit ke nilai nyata. Di beberapa pembuat formulir, Anda melakukan ini dengan membuat bidang yang diperlukan dan memberinya nilai default. Maka Anda bisa menguji dengan
...'meta_value' => 0
andal.Lakukan dua kueri, yang pertama menguji nilai salah dan yang kedua menguji tanpa nilai. Ini dapat digabungkan menjadi satu WP_Query seperti ini:
Ini mungkin bukan permintaan yang efisien. Bergantung pada banyak faktor, mungkin lebih baik mengembalikan semua objek dan memfilternya dalam kode Anda sendiri.
Dalam hal itu, satu
'NOT EXISTS'
permintaan akan andal mengembalikan objek yang benar. (Saya tidak berpikir banyak pembuat formulir atau plugin mendukung perilaku ini, jadi saya hanya akan menggunakannya dalam kode khusus murni.)sumber