it-swarm.com.de

Meta-Abfrage mit booleschem True/False-Wert

Ich versuche, alle Mietobjekte anzuzeigen, zuerst alle Objekte, die noch nicht vermietet wurden, und dann alle Objekte, die derzeit vermietet sind. Es gibt einen benutzerdefinierten Post-Typ 'rent' mit benutzerdefiniertem Post-Meta für den gemieteten Preis (_price_rented), der ein Kontrollkästchen darstellt (gibt entweder true oder false zurück ... true, wenn er gemietet wurde). Ich muss die Abfrage ändern, um alle Eigenschaften mit den verfügbaren (nicht gemieteten) Eigenschaften anzuzeigen, die zuerst und dann die gemieteten Eigenschaften erscheinen.

Hier ist meine Frage:

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

Aus irgendeinem Grund zeigt diese Abfrage alle Eigenschaften, die vermietet wurden. Wenn ich den Wert in der meta_query von 'false' auf 'true' ändere, werden keine Eigenschaften angezeigt.

Also, dann dachte ich, der Rückgabewert ist entweder falsch (für Eigenschaften, die vermietet werden) oder NULL (für Eigenschaften, die nicht vermietet werden), aber ich bin nicht sicher, wie man ein NULL-Ergebnis abfragt (nicht falsch), ich fügte hinzu ' Vergleiche 'argument mit der meta_query und setze den Wert auf'! = ', aber das hat auch nicht funktioniert.

EDIT: var_dump gibt Folgendes für eine verfügbare, nicht vermietete Wohnung zurück: string(0) "" und für eine nicht verfügbare, vermietete Wohnung: string(1) "1"

8
Kegan Quimby

Ich hatte das gleiche Problem und fand nach einer Stunde der Suche den "NOT EXISTS" und den "EXISTS" Wert ( only in WP >= 3.5 ). Sie müssen also nicht nach einem Metawert fragen, sondern müssen nur prüfen, ob der meta_key vorhanden ist:

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

Es funktioniert perfekt für mich.

3
Thibaut

TL; DR: Dieses Problem tritt wahrscheinlich meistens auf, wenn ein Boolesches Feld als optional erstellt wird. Sie können das Problem beheben, indem Sie es erforderlich machen oder eine komplexere Abfrage verwenden, um den Standardfall abzurufen.

Mehr Details:

Hier treten zwei Probleme bei der Datendarstellung auf: Zum einen werden die Datenwerte verwendet, um wahr/falsch darzustellen, und zum anderen, ob das Feld überhaupt gespeichert wird oder nicht, wenn es sich um den Standardwert (normalerweise falsch) handelt.

Teil 1: Ich habe mir die von WP_Meta_Query generierte SQL für Vergleiche mit true und false angesehen und festgestellt, dass sie für true '1' und für false '' (die leere Zeichenfolge) ersetzt. Was auch immer Sie in die Datenbank schreiben, muss damit einverstanden sein, wenn Sie Abfragen durchführen, die mit tatsächlichen wahren und falschen Werten verglichen werden. Insbesondere möchten Sie nicht '0' für falsch schreiben. Es ist möglicherweise kinderleichter, stattdessen auf 0 und 1 zu schreiben und zu testen (und viele Formularersteller tun dies). Überprüfen Sie jedoch, was in die Datenbank geschrieben wird, und berücksichtigen Sie dies, wenn Sie Ihre Abfrage erstellen.

Teil 2: Unter der Annahme, dass false der Standardwert ist, ist es einfach, Datensätze zu finden, deren Wert true ist:

... 'meta_key' => 'my_key', 'meta_value' => 1 (oder true)

Die andere Seite ist jedoch herausfordernd: Möglicherweise gibt es einen falschen oder gar keinen Wert. Dies kann vorkommen, wenn der Wert in einem Formular als optional aufgeführt wurde. Solange der Benutzer ihn nicht explizit festlegt oder ändert, wird er nicht zur Datenbank hinzugefügt. Beachten Sie, dass, wenn Sie nur get_post_meta verwenden, dies problemlos funktioniert: Wenn Sie einen falschen Wert und keinen Wert zurückgeben, wird dasselbe erreicht.

Aber wenn Sie WP_Query verwenden, ist das nicht so einfach. (Oder wenn ja, ich habe noch nicht herausgefunden, wie).

Sie haben zwei (oder vielleicht drei) Möglichkeiten:

  1. Stellen Sie sicher, dass das Feld immer explizit auf einen realen Wert initialisiert wird. In einigen Form Buildern machen Sie dies erforderlich, indem Sie dem Feld einen Standardwert zuweisen. Dann können Sie ...'meta_value' => 0 zuverlässig testen.

  2. Führen Sie zwei Abfragen aus, wobei die erste auf einen falschen Wert und die zweite auf keinen Wert überprüft. Diese können wie folgt zu einer einzelnen WP_Query kombiniert werden:

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

Dies ist wahrscheinlich keine effiziente Abfrage. Abhängig von vielen Faktoren ist es möglicherweise besser, alle Objekte zurückzugeben und sie in Ihrem eigenen Code zu filtern.

  1. Es ist möglich, 'no value' zu verwenden, um false zu bedeuten. Wenn der Wert auf false gesetzt werden soll, müssen Sie dazu den Meta-Wert löschen anstelle von Aktualisieren it.

In diesem Fall gibt eine einzelne 'NOT EXISTS'-Abfrage zuverlässig die richtigen Objekte zurück. (Ich glaube nicht, dass viele Form Builder oder Plugins dieses Verhalten unterstützen. Daher würde ich es nur in rein benutzerdefiniertem Code verwenden.)

2
Denise Draper