Berikut adalah argumen untuk pertanyaan saya:
$args = array(
'post_type' => 'news',
'meta_query' => array(
array(
'key' => 'topics',
'value' => 'sports',
)
)
);
Ini berfungsi saat topics
string, tetapi tidak ketika array. Saya ingin agar kueri ini berfungsi ketika topics
misalnyaarray( 'sports', 'nonprofit', etc. )
Apakah ada cara untuk membangun kueri meta dengan array sebagai meta_key?
query
meta-query
mike23
sumber
sumber
Jawaban:
Mengumpankan kueri dengan nilai yang mungkin
Jika nilai dalam database adalah string dan Anda ingin memberi makan beberapa nilai query:
Mencari nilai tertentu dalam array data serial
Jika nilai dalam database adalah array dari beberapa topik dan Anda ingin mencari satu topik dalam array itu (Perhatikan bahwa array dalam database dapat diambil seperti itu, tetapi tinggal di database dalam bentuk serial, yang merupakan string juga):
Menggunakan 'LIKE' sebagai nilai perbandingan bukanlah instruksi yang jelas seperti yang Anda harapkan, tetapi itu adalah opsi terbaik untuk digunakan.
Di samping itu, satu-satunya pilihan Anda akan mengambil semua posting yang memiliki "topik" meta_key ditetapkan dan mengulanginya secara manual atau, dengan kata lain, periksa nilai dalam loop dan menampilkan posting pada kondisi tersebut.
sumber
Untuk keluar dari respons Johannes, karena ini adalah array serial, jika Anda menyimpan sesuatu seperti id pengguna (yang merupakan kasus saya), Anda mungkin perlu menanganinya sedikit berbeda.
Pos meta diselamatkan seperti:
Jadi ya mereka bilangan bulat tetapi melalui
update_post_meta
mereka diselamatkan sebagai string.Jadi Anda benar-benar melakukan perbandingan SEPERTI dengan versi string serial dari apa yang Anda cari. Saya menghabiskan beberapa jam untuk mencoba mendapatkan sesuatu seperti ini untuk bekerja dan sejauh ini ini yang terbaik yang bisa saya lakukan.
sumber
'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => ':' . $user_id . ';', 'compare' => 'NOT LIKE' ) )
Karena ketika serial semua nilai disimpan seperti: ' :nilai;'Sedikit perbaikan dari jawaban @sMyles.
Saya memiliki kasus di mana ID telah disimpan baik sebagai string (seperti ketika diambil dari input formulir) dan sebagai bilangan bulat (misalnya
update_post_meta($post_id, authorized_users', array(get_current_user_id()));
). Ini seperti masalah yang terkenal diwp_set_object_terms()
mana Anda dapat menggunakan ID istilah untuk menetapkan istilah, tetapi jika Anda tidak menjadikannya sebagai bilangan bulat pertama, Anda memiliki peluang 50% untuk membuat istilah baru dengan angka-angka tersebut sebagai namanya sebagai gantinya.Ini dapat menyebabkan mereka disimpan secara sangat berbeda dalam larik serial, seperti yang dapat dilihat dari cuplikan kasus seperti itu dari basis data situs pengujian saya:
Kedua hal di atas, ketika diberi makan
print_r()
akan membuat sebagaiUntuk memperbaikinya, saya membuat sedikit penyesuaian
meta_query
dengan menambahkanrelation
dan versi lain dari kueri yang melemparkan nilai sebagai integer, bukan string.Inilah hasil akhirnya:
EDIT: Baru menyadari bahwa metode ini dapat menjalankan risiko tabrakan dengan indeks array, yang dapat memungkinkan seseorang akses ilegal ke materi jika mereka tidak ada dalam array, tetapi ID pengguna mereka muncul sebagai indeks. Dengan demikian, sementara ini berfungsi jika Anda memiliki masalah yang dibahas, praktik yang lebih baik adalah memastikan bahwa nilai apa pun yang ingin Anda cari dilemparkan sebagai string sebelum menyimpannya sehingga Anda dapat menggunakan metode @sMyles sebagai gantinya.
sumber
Saya akan mencari jawaban Johannes. Namun, saya ingin meningkatkannya karena menggunakan meta_query itu, Anda akan menemukan kasus seperti ini
nilai Anda
ketika Anda mencari
maka hasilnya akan mengembalikan 'sport' dan 'sport2'.
Untuk memperbaikinya, ubah meta_query args menjadi
Itu karena nilainya serialisasi dalam database, dan setiap item akan dipisahkan oleh tanda titik koma. Jadi, argumen di atas akan berhasil
Jika item dalam nilai adalah angka, Anda hanya perlu menghapus penawaran ganda "
sumber
Saya mengalami sesuatu yang serupa hari ini. Saya harus menanyakan bidang hubungan ACF (Bidang Khusus Lanjutan) dengan beberapa pengguna terkait (array).
Setelah memperbarui bidang melalui php kueri tidak berfungsi. Setelah memperbaruinya melalui ACF UI, kueri berhasil.
Masalahnya adalah, bahwa kode php saya mengatur nilai hubungan menjadi nilai int, UI mengaturnya ke nilai string. Untuk memastikan keduanya berfungsi, saya menggunakan kueri ini sekarang (cocok dengan contoh di sini):
sumber