WordPress搞砸了‘Pre_Get_Posts’中的‘orderby’=>‘meta_value_num’

时间:2014-04-15 作者:Alain Jacomet Forte

我有很多_ai_price_int 元值设置为数字。这是表格的外观:

meta_id, post_id, meta_key,      meta_value
1309,    1111,    _ai_price_int, 6550
1310,    1115,    _ai_price_int, 7100
1311,    1113,    _ai_price_int, 7500
1312,    1103,    _ai_price_int, 6000
etc.
我用的是pre_get_posts 筛选以修改特定查询,如下所示:

public function filterQuery($query) {
    $query->set(\'post_type\', \'sponsorship\');
    $query->set(\'meta_key\', \'_ai_price_int\');
    $query->set(\'meta_value\', \'4000\');
    $query->set(\'meta_compare\', \'<=\');
    $query->set(\'orderby\', \'meta_value_num\');
    $query->set(\'order\', \'DESC\');
    return $query;
}
add_action(\'pre_get_posts\', Array($this, \'filterQuery\'));
但是玩弄$query->set(\'meta_value\', \'4000\');, 结果证明结果是错误的。

使用时2000, 我收到一篇文章,它的\\u ai\\u price\\u int值为15000.4000, 我收到一篇文章,它的\\u ai\\u price\\u int值为35000.我尝试使用:

    $query->set(\'post_type\', \'sponsorship\');
    $query->set(\'meta_key\', \'_ai_price_int\');
    $query->set(\'orderby\', \'meta_value_num\');
    $query->set(\'order\', \'DESC\');
    $query->set(\'meta_query\', array(
        array(
           \'key\' => \'_ai_price_int\',
           \'value\' => array(0, 4000),
           \'compare\' => \'BETWEEN\'
        )
    ));
相反,结果是一样的。

查看执行的查询,我可以看到它有以下部分:

...AND ((wp_13postmeta.meta_key = \'_ai_price_int\'AND CAST(wp_13postmeta.meta_value AS CHAR) <= \'4000\') )...

Don\'t tell me that WordPress is ordering these values alphabetically?!

我还将此自定义值显式保存为整数:

$price = (int)preg_replace("/([^0-9\\\\.])/i", "", $match[1]);
update_post_meta( $post_id, \'_ai_price_int\', $price );
我做错了什么?

我正在测试WP版本:3.5.2

2 个回复
最合适的回答,由SO网友:Milo 整理而成

使用meta_query 和设置typeNUMERIC-

$query->set(\'meta_query\', array(
    array(
       \'key\' => \'_ai_price_int\',
       \'value\' => array(0, 4000),
       \'compare\' => \'BETWEEN\',
       \'type\' => \'NUMERIC\'
    )
));
$query->set(\'meta_key\', \'_ai_price_int\');
$query->set(\'orderby\', \'meta_value_num\');

SO网友:Stephen S.

我想你可能需要改变$query->set(\'meta_value\', \'4000\');$query->set(\'meta_value_num\', \'4000\'); 在pre\\u get\\u posts筛选器中。

WP\\U查询文档注意到:

通过使用“meta\\u value”参数,值99将被视为大于100,因为数据存储为“字符串”,而不是“数字”。对于数字比较,请使用“meta\\u value\\u num”

发件人:http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

结束