ブール値のtrue / false値を持つメタクエリ


11

私はすべての賃貸物件を表示しようとしています。まずは賃貸されていないすべての物件、次に現在賃貸されているすべての物件を表示します。チェックボックス(レンタルされている場合はtrueまたはfalse ... trueを返す)である、レンタル価格(_price_rented)のカスタムポストメタを持つカスタムポストタイプ 'rent'があります。使用可能な(レンタルされていない)プロパティが最初に表示され、次にレンタルされたプロパティが表示されるすべてのプロパティを表示するようにクエリを変更する必要があります。

これが私のクエリです:

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

何らかの理由で、このクエリはレンタルされたすべてのプロパティを表示します。meta_queryで値を「false」から「true」に切り替えると、プロパティが表示されません。

だから、私は思った、戻り値はfalse(レンタルされているプロパティの場合)またはNULL(レンタルされていないプロパティの場合)のいずれかですが、NULLの結果をクエリする方法(falseではない)がわからないため、「引数をmeta_queryと比較し、値を「!=」に設定しますが、これも機能しませんでした。

編集:var_dumpは、利用可能な賃貸されていないアパートstring(0) ""について、および利用できない賃貸されたアパートについて、以下を返します。string(1) "1"


おそらく1と0の値を使用していますか?
reikyoushin 2013

meta_query type => string。可能な値は、「NUMERIC」、「BINARY」、「CHAR」、「DATE」、「DATETIME」、「DECIMAL」、「SIGNED」、「TIME」、「UNSIGNED」です。デフォルト値は「CHAR」です。
iEmanuele 2013

@reikyoushin:「1」を使用するとすべてのレンタルプロパティが返され、「0」を使用するとプロパティは返されません。
Kegan Quimby 2013

1
@iEmanuele:変更しても効果がないようです(同じことを考えました)。私はそれをこの記事から見ました:thethemefoundry.com/blog/…–
Kegan Quimby

1
され_price_rented、実際に両方のために設定trueし、false値、またはそれだけのために設定されていますかtrue?データベースを確認してください。チェックされていないチェックボックスがまったく通過しないPOSTので、そのような場合に値が設定されているのではないかと質問しました。
s_ha_dum 2013

回答:


4

WP_Meta_Query どういうわけかコアでは「それほど安定していない」部分であり、あまり注意を払わないと混乱しやすくなります。

a new WP_Query()を実行していて、meta_query => array()引数またはそれに対応する単一のキーと値のペアがある場合は、new WP_Meta_Query()ジャンプしてすぐに解析を行います。

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

許容値

メタデータをクエリする場合、boolオプションがあります。そして、それを使用する場合、それはにフォールバックしCHARます。許可される値の配列としてのデフォルト値は次のとおりです。

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

どこNUMERICにリセットされますSIGNED

デバッグ中

保存後のプロセスに影響を与える可能性のあるフィルターは多数あるため、最初に行うことは、いくつかのループ内のさまざまな値をチェックすることです。

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

その後、戻り値に応じて、次のいずれかを使用する必要がありますSIGNED結果がある場合、0または1、または"true"、または"false"結果が文字列である場合。それは本当にブールであれば、私はまだ使用することをお勧めしたいstringだけ必ずそれを渡しにするために$GLOBALS['wpdb']のみ渡すことができ、%s文字列と%dを通して数字を。

その他の注意事項

今日のコーデックスエントリをWP_Meta_Query更新しところ、さまざまな出力がたくさんあることがわかりました(コアに移動た単一のパッチなしで、ここここTrac JOINS説明されている不要な大量の出力が追加されています)。(ここでパーツのチケットをフォローアップ)ポイントは、配列とそのサブ配列と一緒に引数の組み合わせを使用できることです。その結果は、あなたがそれをダンプしない限り、ほとんど不明である私見使用すると、1つのどちらか使用して方がいいでしょう入力を追加する他の方法を。特にあなただけのとき ANDmeta_*meta_queryこれを使用するとmeta_key、場合によっては「キーのみのクエリ」が発生します。

解決

コメントで指摘したように:

(...)var_dumpは、string(0) ""利用可能な、賃貸されていないアパートについて、および利用できない、賃貸されたアパートについて、以下を返します。string(1) "1"

今、meta_query使用する必要があります

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

「空室のない賃貸アパート」を取得したい場合、またはを使用'!='して「賃貸していない」アパートを取得する場合。

注:の可能な値meta_compare'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP'または'RLIKE'です。デフォルト値は'='です。


3

私は同じ問題に直面し、1時間の検索の後に"NOT EXISTS"との"EXISTS"値が見つかりました( only in WP >= 3.5 )。したがって、メタ値を要求する必要はありません。meta_keyが存在するかどうかを確認するだけです。

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

私にとっては完全に機能しています。


3

TL; DR:この問題は、ほとんどの場合、ブールフィールドがオプションとして作成されたときに発生します。これを修正するには、必須にするか、より複雑なクエリを使用してデフォルトのケースを取得します。

詳細:

ここで起こっている2つのデータ表現の問題があります。1つはtrue / falseを表すために使用されているデータ値であり、もう1つはデフォルト(通常はfalse)値である場合にフィールドがまったく保存されているかどうかです。

パート1:WP_Meta_Querytrueとfalseの比較のためにによって生成されたSQLを調べたところ、trueの場合は「1」とfalse ''(空の文字列)の代わりになることがわかりました。したがって、データベースに書き込むものはすべて、実際のtrue値とfalse値と比較するクエリを実行する場合は、それに同意する必要があります。特に、falseに「0」を書き込む必要はありません。代わりに0と1を記述してテストする方が簡単です(多くのフォーム作成者がそれを行います)。ただし、データベースに何が書き込まれているのかを確認し、クエリを作成するときにそのことを覚えておいてください。

パート2:falseがデフォルト値であるとすると、値がtrueのレコードを見つけるのは簡単です。

... 'meta_key' => 'my_key', 'meta_value' => 1 (または本当)

しかし、反対側は挑戦的です。つまり、誤った値が存在する場合や、まったく値がない場合があります。これは、値がフォームにオプションとしてリストされている場合に発生する可能性があります---ユーザーが明示的に設定または変更しない限り、データベースに追加されません。あなたがget_post_metaそれを使用しているだけならこの方法でうまく機能することに注意してください:偽の値を返し、値を返さないことは同じことを達成します。

しかし、を使用している場合WP_Query、それほど簡単ではありません。(またはそうである場合、私はまだ方法を理解していません)。

2つ(または3つ)のオプションがあります。

  1. フィールドが常に明示的に実際の値に初期化されていることを確認してください。一部のフォームビルダーでは、これを行うには、フィールドを必須にしてデフォルト値を指定します。その後、...'meta_value' => 0 確実にテストできます。

  2. 2つのクエリを実行します。最初のクエリは偽の値をテストし、2番目のクエリは値をテストしません。これらは、次のように1つのWP_Queryに組み合わせることができます。

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

これはおそらく効率的なクエリではありません。多くの要因によっては、すべてのオブジェクトを返し、独自のコードでそれらをフィルタリングする方がよい場合があります。

  1. falseを意味する「no value」を使用することが可能です。これを行うには、値をfalseに設定する必要がある場合は常に、メタ値更新する代わりに削除する必要があります。

その場合、1つの'NOT EXISTS'クエリで確実に正しいオブジェクトが返されます。(多くのフォームビルダーまたはプラグインがこの動作をサポートしているとは思わないため、純粋にカスタムコードでのみ使用します。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.