Bir meta anahtarın bulunmadığı tüm mesajları sorgula


50

Belirli bir meta_keyvar olmadığı tüm mesajları almak ve daha sonra oluşturmak için bir sorgu almaya çalışıyorum .

Bu gönderileri bulmakta zorlanıyorum, test ettiğim sorgu çalışmıyor gibi görünüyor.

İşte bu yayınları almaya çalışmak için kullandığım kod:

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

query_posts($args);

Bu anahtarla hiçbir mesaj yoksa hiçbir şey döndürmez colors, ancak bu anahtar bulunduğunda (ihtiyacımın tam tersi olduğunda) idsanahtarla colorsyazılanları döndürür . Bunun EXISTyerine denedim ama şans yok.

Birisi bana ihtiyacım olan gibi bir sorgu oluşturma yolunda doğru ipucu verebilir, takdir edecektir.

Teşekkürler!


Hangi WordPress sürümünü kullanıyorsunuz?
s_ha_dum

Merhaba, ihmal için özür dilerim.
V3.5

Görünen o ki, bu sorgu türü (kıyaslama NOT VARSAYILAN olarak ayarlanmış) 3.5 olarak eklenmiş gibi görünüyor, bu yüzden görebildiğim kadarıyla çalışması gerekiyor. Özel SELECT sorgusu ile bunu yapmak kolay olurdu, ama ...
Tomas Buteler

Teşekkürler select kullanarak deneyeceğim. Hangi tabloları sorgulayacağınızı ve sorguyu nasıl
karşılayacağımı daha

Çok ilginç. Bu kodla ilgili bir sorun tespit edemiyorum ve siz 3.5 + kullanıyorsunuz, bu yüzden sordum. Verilerinizin, düşündüğünüz gibi eklendiğini onaylamak için gerçekten veritabanına baktınız mı?
s_ha_dum

Yanıtlar:


73

Bununla biraz daha test yaptım ve dürüst olmak gerekirse işe yaramayacak bir neden bulamadım (yukarıdaki kod sadece bir snippet değilse ve gerçek kod aşağıdaki örneklerime uymuyorsa). Bununla birlikte, sizi doğru yöne götürecek birkaç şey keşfettim.

1) Kendi başına bu meta sorgusu "colours IS NULL" ile eşdeğerdir, yani postmeta tablosunda bu tuşa sahip olmayan mesajları döndürür. Yukarıda gösterilen durum budur ve çalışması gerekirdi.

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

2) WordPress 3.9'dan önce, 'OR' ile 'ilişki' dizini oluşturmak bu koşulu değiştirir. Tersini döndürür. Bana nedenini sorma. Birden çok meta sorgusu yaparken bu özellikle önemlidir. Bu, başlangıçta 'renkler' anahtarının 'mavi' (veya her neyse) olarak ayarlanmış veya hiç ayarlanmamış olan yazılar için bir sorgu yapmasının mümkün olmadığı anlamına gelir. Aşağıdaki sorgu ilk koşulu yok sayar ve yalnızca ikinci koşula uyanları döndürür.

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

3) Bununla birlikte, eğer 'değerini' koyarsak, WordPress'i ilk koşulu kullanmaya kandırabiliriz. İlgili bir değere ihtiyacı yoktur (bildiğim kadarıyla göz ardı edilir), ancak koşulun herhangi bir etkisi olması için ayarlanmasıNOT EXISTS gerekir.

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

Bu, WordPress 3.9'a kadar doğruydu. Hala daha eski bir sürüm kullanıyorsanız, bu uygun bir geçici çözümdür.


Teşekkürler! Ve gecikme için üzgünüm. Bir sorgu kullandım, ancak çözümünüzü birkaç saat içinde test edeceğim, böylece geri dönebilirim ve belki bu işe yararsa başkalarına yardımcı olabiliriz. Kontrol edebileceğim en kısa sürede size haber vereceğim. Tekrar teşekkürler
JordanBel

İyi yazılmış ve boş bir değer eklemenin beklenen sonuçları verdiğini doğruladı. İstenmeyen olduğunu söyleyebilirim, zaten bir bilet olup olmadığını görmek için trac.wordpress.org'a bir göz atmaya değer olabilir, eğer değilse, bu tekrarlanabilir.
Taylor Dewey

Büyük açıklama ve WP :) kandırmak için çözüm sayesinde buraya gelmek için biraz zaman alabilir mi - ama şimdi en az 10 kez upvote tıklayın istediğiniz (sadece Yapabilsem;))
lorem maymun

Eğer karşılaştırmalı EXISTS karşılaştırmasını kullanırsam,
WP'nin

10
EXISTSVe NOT EXISTSbir değeri belirtmek için size gerekli "böcek", WP 3.9 giderilmiştir
trex005

11

Özel bir sorgu kullanarak bu benim için çalıştı:

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
            ) 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.