具有布尔值true / false的元查询


11

我试图显示所有租赁物业,首先显示所有尚未租赁的物业,然后显示当前已租赁的所有物业。对于租用的价格(_price_rented),有一个带有自定义帖子元的自定义帖子类型“租金”,该复选框是一个复选框(如果已租借,则返回true或false ... true)。我需要更改查询以显示所有属性,并首先显示可用(非出租)属性,然后再显示租用属性。

这是我的查询:

$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

meta_query类型 =>字符串。可能的值为“ NUMERIC”,“ BINARY”,“ CHAR”,“ DATE”,“ DATETIME”,“ DECIMAL”,“ SIGNED”,“ TIME”和“ UNSIGNED”。默认值为“ CHAR”。
iEmanuele

@reikyoushin:使用“ 1”将返回所有租用的属性,而使用“ 0”将不返回任何属性。
Kegan Quimby

1
@iEmanuele:更改似乎没有任何效果(我想同样的事情)。我从这篇文章中看到了:thethemefoundry.com/blog/…–
Kegan Quimby

1
_price_rented实际设置两个truefalse值,或者只设置true?请检查数据库。我问,因为根本没有通过未选中的复选框POST,所以我想知道是否针对这些情况设置了该值。
s_ha_dum 2013年

Answers:


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,如果结果是01"true""false"如果结果是一个字符串。如果确实是布尔值,那么我仍然建议string仅使用以确保它通过$GLOBALS['wpdb'],它只能通过%s字符串和%d数字。

补充笔记

当我今天更新Codex条目时WP_Meta_Query,我看到可能有很多不同的输出(添加了大量不需要的内容JOINS,在这里这里Trac 上进行了讨论,而没有将单个补丁移入内核)。(跟进门票零部件这里)一点是,它可以使用的组合参数的旁边阵列及其子阵列。除非将其转储,否则结果几乎是未知的,所以恕我直言,最好使用一种另一种添加输入的方法。特别是当你只有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

我遇到了同样的问题,经过一个小时的搜索,发现了"NOT EXISTS""EXISTS"( only in WP >= 3.5 )。因此,无需询问元值,只需检查meta_key是否存在:

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

它对我来说非常好用。


3

TL; DR:当布尔字段创建为可选字段时,此问题很可能会发生。您可以通过将其设置为必需的来修复它,也可以使用更复杂的查询来检索默认情况。

更多细节:

这里存在两个数据表示问题:一个是使用哪个数据值表示true / false,另一个是如果该字段是默认值(通常为false),则是否存储该字段。

第1部分:我研究了SQL生成的SQL WP_Meta_Query与True和false的比较,发现对于true,它替代了'1'和false”(空字符串)。因此,无论您要写入什么数据库,都需要同意与实际的true和false值进行比较的查询。特别是,您不想为假写“ 0”。改为编写和测试0和1可能更加安全(许多表单构建器都这样做)。但是请检查一下正在写入数据库的内容,并在构建查询时牢记这一点。

第2部分:假定false为默认值,查找值为true的记录很容易:

... 'meta_key' => 'my_key', 'meta_value' => 1 (或正确)

但是另一面具有挑战性:可能有一个错误的值,或者可能根本没有任何值。如果以格式---将该值列为可选值,则可能会发生这种情况,那么只要用户未明确设置或更改它,就不会将其添加到数据库中。请注意,如果仅使用get_post_meta它,则将以这种方式很好地工作:返回一个假值而不返回任何值将完成相同的操作。

但是,当您使用时WP_Query,并不是那么容易。(或者,如果还没有,我还没有弄清楚如何)。

您有两个(或三个)选项:

  1. 确保该字段始终明确地初始化为实际值。在某些表单构建器中,您可以通过将该字段设置为必填字段并为其指定默认值来实现此目的。然后,您可以进行...'meta_value' => 0 可靠的测试。

  2. 进行两个查询,第一个查询测试错误值,第二个查询测试无值。可以将它们组合成单个WP_Query,如下所示:

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

这可能不是有效的查询。根据许多因素,最好返回所有对象并将其过滤到您自己的代码中。

  1. 可以使用“无值”表示错误。为此,无论何时将值设置为false,都必须删除元值而不是对其进行更新

在这种情况下,单个'NOT EXISTS'查询将可靠地返回正确的对象。(我不认为很多表单构建器或插件都支持这种行为,所以我只会在纯自定义代码中使用它。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.