Boolean true / false değeri içeren meta sorgu


11

İlk olarak kiralanmamış tüm özellikleri ve daha sonra şu anda kiralanan tüm özellikleri tarafından tüm kiralama özelliklerini göstermeye çalışıyorum. Bir kira kutusu (kiralanmışsa doğru veya yanlış ... doğru döndürür) için kiralanan fiyat (_price_rented) için özel posta metali özel bir posta türü 'kira' vardır. Ben ilk görünen ve sonra kiralanan özellikleri görünen kullanılabilir (kiralanmamış) özellikleri ile tüm özellikleri göstermek için sorguyu değiştirmek gerekiyor.

İşte benim sorgu:

$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',
        ),
    ) 
) 
);

Nedense bu sorgu kiralanmış tüm özellikleri gösterir. Ben meta_query içinde 'false' değerini 'true' olarak değiştirdiğimde herhangi bir özellik göstermez.

Bu nedenle, dönüş değeri ya yanlış (ARE kiralanan özellikler için) ya da NULL (kiralanmayan özellikler için), ancak NULL sonuç (yanlış değil) nasıl sorgulanacağından emin değilim diye düşündüm. 'argümanını meta_query ile karşılaştırın ve değeri'! = 'olarak ayarlayın ancak bu da işe yaramadı.

EDIT: var_dump kullanılabilir, kiralanmamış bir daire için aşağıdakileri döndürür: string(0) ""ve mevcut olmayan, kiralanmış bir daire için:string(1) "1"


belki de 1 ve 0 değerlerini mi kullanıyorsunuz?
reikyoushin

meta_query type => dize. Olası değerler 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. Varsayılan değer 'CHAR'dır.
iEmanuele

@reikyoushin: '1' kullanmak kiralanan tüm özellikleri döndürür ve '0' hiçbir özellik döndürmez.
Kegan Quimby

1
@ iEmanuele: Değişen bir etkisi yok gibi görünüyor (aynı şeyi düşündüm). Bunu bu makaleden gördüm: thethemefoundry.com/blog/…
Kegan Quimby

1
Is _price_rentedaslında her ikisi için ayarlanmış trueve falsedeğerler, yoksa yalnızca ayarlanır true? Veritabanını kontrol edin. Ben kontrolsüz bir onay kutusu hiç geçmedi çünkü sordum, POSTbu yüzden değeri bu durumlar için hiç ayarlanmış olup olmadığını merak ediyorum.
s_ha_dum

Yanıtlar:


4

WP_Meta_Query çekirdek bir şekilde "bu kadar istikrarlı değil" bir parçasıdır ve verrry fazla dikkat etmezseniz kolayca karıştırılmadan kırılabilir.

Bir new WP_Query()ve meta_query => array()argüman veya tek anahtar / değer çifti eşdeğeri yaptığınızda new WP_Meta_Query(), hemen atlar ve ardından ayrıştırma yapılır.

$this->meta_query = new WP_Meta_Query();
$this->meta_query->parse_query_vars( $q );

İzin verilen değerler

Meta verileri sorguladığınızda, boolseçenek vardır. Ve bunu kullanırsanız CHAR, izin verilen değerler dizisi olarak varsayılan değerin olduğu yere geri döner :

'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'

nereye NUMERICsıfırlanacak SIGNED.

Hata ayıklama

Kayıt sonrası işlemi etkileyebilecek çok sayıda filtre vardır, bu nedenle yapılacak ilk şey, bir döngü içindeki farklı değerleri kontrol etmektir:

var_dump( get_post_meta( get_the_ID(), '_price_rented', true ) );

Sonra dönüş değerine bağlı olarak ya da kullanmak gerekecek SIGNEDsonuç ise, 0ya 1, ya "true"ya "false"sonuç bir dize ise. Gerçekten boolean ise, o zaman stringsadece geçer ve $GLOBALS['wpdb']sadece %sdize ve %drakam geçebilir emin olmak için kullanmanızı öneririm .

ek Notlar

Sadece güncellenen gibi Codex girişiniWP_Meta_Query bugün, ben farklı çıkışların orada sürü konum (gereksiz sayısız miktarda ekleyerek gördüm JOINSüzerinde tartışılır, Trac burada ve burada birlikte dışarı olası çekirdek taşındı tek yama). (İçin bilet Takip ANDparça burada Noktası tam o) olduğu bir kombinasyonunu kullanmak mümkündür meta_*yanında argümanları meta_querydizisi ve altdizilimlerden. Eğer dökümü yoksa sürece sonuç hemen hemen bilinmiyor, bu yüzden IMHO giriş eklemenin birini ya da başka bir yolunu kullanarak daha iyi . Özellikle de sadecekullanarak meta_keybazı durumlarda bir "anahtar sadece sorguda" Bu sonuçlar gibi.

Çözüm

Yorumlarda belirtildiği gibi:

(...) var_dumpmüsait, kiralanmamış bir daire için ve aşağıdakileri içermez: string(0) ""ve mevcut olmayan, kiralık bir daire için:string(1) "1"

Şimdi meta_querykullanmak zorunda

'meta_query' => array( 'relation' => 'OR', array(
    'meta_key'     => '_price_rented',
    'meta_value'   => '1',
    'meta_compare' => '='
) );

"Olmayan mevcut, kiralık daireler" '!='almak veya "kiralık olmayan" daire almak için kullanın .

Not: için olası değerler meta_compareşunlardır '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP'veya 'RLIKE'. Varsayılan değer şudur '='.


3

Aynı sorunla karşılaştım ve bir saatlik bir aramadan sonra "NOT EXISTS"ve "EXISTS"değerini buldum ( only in WP >= 3.5 ). Bu nedenle bir meta değeri istemenize gerek yok, sadece meta_key'in var olup olmadığını kontrol edin:

'meta_key'     =>   '_price_rented'  ,
'meta_compare' =>   'NOT EXISTS'     ,

Benim için mükemmel çalışıyor.


3

TL; DR: Bu sorun büyük olasılıkla isteğe bağlı olarak bir boole alanı oluşturulduğunda ortaya çıkar. Gerekli duruma getirerek veya varsayılan durumu almak için daha karmaşık bir sorgu kullanarak düzeltebilirsiniz.

Daha fazla detay:

Burada devam eden iki veri temsil sorunu vardır: biri veri değerlerinin true / false değerini temsil etmek için kullanıldığı, diğeri ise alanın (genellikle false) varsayılan olması durumunda depolanıp depolanmadığıdır.

Bölüm 1: WP_Meta_QueryDoğru ve yanlış karşılaştırmalar için oluşturulan SQL baktı ve doğru için '1' ve yanlış '' (boş dize) yerine bulundu. Veritabanına ne yazıyorsanız, bunu kabul etmeniz gerekir, eğer gidecekseniz gerçek doğru ve yanlış değerlerle karşılaştırmalı sorgular yapın. Özellikle, yanlış için '0' yazmak istemezsiniz. Bunun yerine 0 ve 1 için yazmak ve test etmek daha kusursuz olabilir (ve birçok form oluşturucu bunu yapar). Ancak veritabanına ne yazıldığını kontrol edin ve sorgunuzu oluştururken bunu aklınızda bulundurun.

Bölüm 2: false değerinin varsayılan değer olduğunu varsayarsak, değeri doğru olan kayıtları bulmak kolaydır:

... 'meta_key' => 'my_key', 'meta_value' => 1 (veya doğru)

Ancak diğer taraf zorlayıcıdır: yanlış bir değer olabilir veya hiç bir değer olmayabilir. Bu değer bir formda isteğe bağlı olarak listelenmişse oluşabilir - daha sonra kullanıcı açıkça ayarlamadığı veya değiştirmediği sürece veritabanına eklenmez. Yalnızca kullanıyorsanız, get_post_metabu şekilde işe yarayacağını unutmayın: yanlış bir değer döndürmek ve hiçbir değer döndürmemek aynı şeyi başaracaktır.

Ama kullanırken WP_Query, o kadar kolay değil. (Ya da öyleyse, henüz nasıl olduğunu anlayamadım).

İki (veya belki üç) seçeneğiniz vardır:

  1. Alanın her zaman açıkça gerçek bir değere ayarlandığından emin olun. Bazı form oluşturucularda, bunu alanı zorunlu hale getirip varsayılan bir değer vererek yaparsınız. Sonra ...'meta_value' => 0 güvenilir bir şekilde test edebilirsiniz .

  2. İlki yanlış değer için test eden ve ikincisi değer test etmeyen iki sorgu yapın. Bunlar aşağıdaki gibi tek bir WP_Query'de birleştirilebilir:

    meta_query => {
        relation => 'OR'
        array(
            'key'     => 'my_key',
            'value'   => 0,
            'compare' => '='
        ),
        array(
            'key'     => 'my_key',
            'compare' => 'NOT EXISTS',
        ),
    )

Bu muhtemelen etkili bir sorgu değildir. Birçok faktöre bağlı olarak, tüm nesneleri döndürmek ve bunları kendi kodunuzda filtrelemek daha iyi olabilir.

  1. Yanlış anlamında 'değer yok' kullanmak mümkündür. Bunu yapmak için, değerin false olarak ayarlanması gerektiğinde , meta değeri güncellemek yerine silmeniz gerekir.

Bu durumda, tek bir 'NOT EXISTS'sorgu doğru nesneleri güvenilir bir şekilde döndürür. (Birçok form oluşturucu veya eklentinin bu davranışı desteklediğini düşünmüyorum, bu yüzden sadece tamamen özel kodda kullanırım.)

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.