Permintaan semua posting di mana kunci meta tidak ada


50

Saya mencoba untuk mendapatkan kueri untuk mengambil semua posting di mana meta_keytidak ada yang spesifik dan kemudian membuatnya.

Saya mengalami masalah menemukan pos tersebut karena kueri yang saya uji sepertinya tidak berfungsi.

Berikut adalah kode yang saya gunakan untuk mencoba mendapatkan posting tersebut:

$args = array(
   'posts_per_page' => 18,
   'cat'=>1955,
   'post_status'=>'publish',
   'meta_query' => array(
                  array(
                     'key' => 'colors',
                     'compare' => 'NOT EXISTS'
                  ),
   ));      

query_posts($args);

Ini tidak menghasilkan apa-apa jika tidak ada posting dengan kunci colors, tetapi mengembalikan mereka idsdari posting dengan kunci colorssetiap kali kunci itu ada (kebalikan dari apa yang saya butuhkan). Saya mencoba dengan EXISTgantinya tetapi tidak berhasil.

Jika seseorang dapat memberi saya tip tentang cara membuat kueri yang benar seperti yang saya butuhkan, saya akan sangat menghargainya.

Terima kasih!


Apa versi WordPress yang Anda gunakan?
s_ha_dum

Hai, maaf atas kelalaiannya. Saya menggunakan v3.5
JordanBel

Sepertinya jenis kueri (dengan set yang disetel ke TIDAK ADA) ditambahkan dalam 3,5, jadi itu harus berfungsi sebagaimana mestinya, sejauh yang saya bisa lihat. Akan lebih mudah untuk melakukannya melalui kueri SELECT khusus, meskipun ...
Tomas Buteler

Terima kasih saya akan mencoba menggunakan pilih. Saya harus belajar sebelum tabel mana untuk kueri dan bagaimana menyesuaikan kueri :(
JordanBel

Sangat aneh. Saya tidak dapat menemukan masalah dengan kode itu dan Anda menggunakan 3.5+, itulah sebabnya saya bertanya. Sudahkah Anda benar-benar melihat ke basis data untuk mengonfirmasi bahwa data Anda sedang dimasukkan dengan cara yang Anda pikirkan?
s_ha_dum

Jawaban:


73

Saya melakukan beberapa pengujian lagi dengan ini, dan jujur ​​tidak dapat menemukan alasan itu tidak akan berhasil (kecuali kode di atas hanya potongan dan kode sebenarnya cocok dengan contoh saya di bawah). Namun, saya menemukan beberapa hal yang mungkin menuntun Anda ke arah yang benar.

1) Dengan sendirinya, kueri meta ini setara dengan "warna IS NULL", artinya akan mengembalikan tulisan yang tidak memiliki kunci yang ditetapkan di tabel postmeta. Ini adalah kasus yang ditunjukkan di atas, dan seharusnya sudah bekerja.

'meta_query' => array(
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // this should work...
    ),
)

2) Sebelum WordPress 3.9, menetapkan indeks 'hubungan' ke 'ATAU' mengubah kondisi ini. Ia mengembalikan yang sebaliknya. Jangan tanya kenapa. Ini sangat penting ketika melakukan beberapa meta queries. Itu berarti bahwa pada awalnya tidak mungkin melakukan kueri untuk posting yang memiliki kunci 'warna' diatur ke 'biru' (atau apa pun) atau tidak disetel sama sekali. Kueri di bawah ini akan mengabaikan kondisi pertama dan hanya mengembalikan yang cocok dengan kondisi kedua.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS' // doesn't work
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

3) Namun, kita dapat membodohi WordPress menggunakan kondisi pertama jika kita menetapkan 'nilai'. Tidak perlu nilai yang relevan (itu diabaikan, sejauh yang saya tahu), tetapi perlu diatur agar NOT EXISTSkondisi tersebut memiliki efek apa pun.

'meta_query' => array(
   'relation' => 'OR',
    array(
     'key' => 'colors',
     'compare' => 'NOT EXISTS', // works!
     'value' => '' // This is ignored, but is necessary...
    ),
    array(
     'key' => 'colors',
     'value' => 'blue'
    )
)

Ini benar hingga WordPress 3.9. Jika Anda masih menggunakan versi yang lebih lama, ini merupakan solusi yang layak.


Terima kasih! Dan maaf atas keterlambatannya. Saya akhirnya menggunakan kueri, tetapi saya akan menguji solusi Anda di jam-jam berikutnya sehingga saya dapat beralih kembali dan mungkin jika ini berhasil, kami dapat membantu yang lain. Saya akan memberi tahu Anda segera setelah saya bisa memeriksanya. Terima kasih lagi
JordanBel

Ditulis dengan baik dan dikonfirmasi bahwa menambahkan nilai kosong mengembalikan hasil yang diharapkan. Saya akan mengatakan itu tidak disengaja, mungkin patut dilihat di trac.wordpress.org untuk melihat apakah sudah ada tiket, jika tidak, ini dapat direproduksi.
Taylor Dewey

Terima kasih atas penjelasan dan solusi hebat untuk mengelabui WP :) Butuh waktu untuk sampai di sini - tapi sekarang saya ingin mengklik upvote setidaknya 10 kali (jika saya bisa;))
lorem monkey

Jika saya menggunakan EXISTS bandingkan, sayangnya nilai ini tidak diabaikan dalam versi WP yang lebih baru (diuji pada 4.2.2)
Igor Jerosimić

10
The EXISTSdan NOT EXISTS"bug" yang mengharuskan Anda untuk menentukan nilai, telah diperbaiki di WP 3.9
trex005

11

Menggunakan kueri khusus, ini berfungsi untuk saya:

SELECT * FROM wp_posts as posts
            WHERE   posts.post_type     = 'post'
            AND NOT EXISTS (
              SELECT * FROM `wp_postmeta`
               WHERE `wp_postmeta`.`meta_key` = "your_meta_key"
                AND `wp_postmeta`.`post_id`=posts.ID
            ) 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.