META_QUERY:在浮点数和/或转换为小数之间使用

时间:2011-04-07 作者:Kevin

每个岗位都有一个lat/lng值,通过Posteta附在其上。我正试图抓住一个lat/lng值范围内的所有帖子。这是get_posts 查询:

$posts = get_posts(array(
    \'posts_per_page\' => 100,
    \'post_type\' => \'place\',
    \'post_status\' => \'publish\',
    \'meta_query\' => array(
        array(
            \'key\' => \'places_lat\',
            \'value\' => array($lat_min, $lat_max),
            \'compare\' => \'BETWEEN\',
            //\'type\' => \'DECIMAL\',
        ),
        array(
            \'key\' => \'places_lng\',
            \'value\' => array($lng_min, $lng_max),
            \'compare\' => \'BETWEEN\',
            //\'type\' => \'DECIMAL\',
        ),
    ),
));
由于postmeta值存储为字符串,我想我应该将其转换为DECIMAL, 但由于缺少DECIMAL 参数/精度参数。

我注意到查询处理value 数组作为字符串,这也可能是另一个故障点。运行编译后的查询时,在每个浮点值周围不加引号,效果与预期一样。

我将使用get_permalink() 在每个岗位上。我可以在外部运行自定义查询get_posts (通过$wpdb->get_results()) 要正确抓住边界框内的立柱,请在立柱和之间循环get_permalink, 但它最终会在每篇文章中触发一个额外的数据库查询来构建永久链接-这不是一个理想的解决方案!

有什么想法吗?

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

您可以过滤生成的SQL并添加所需的精度参数。

为启用筛选器get_posts() 通过向查询中添加以下内容:

\'suppress_filters\' => false,
以及:

add_filter(\'posts_where\',\'cast_decimal_precision\');

function cast_decimal_precision( $where ) {

    return str_replace(\'DECIMAL\',\'DECIMAL(10,3)\',$where);
}

Update

根据Jan的建议:

add_filter(\'get_meta_sql\',\'cast_decimal_precision\');

function cast_decimal_precision( $array ) {

    $array[\'where\'] = str_replace(\'DECIMAL\',\'DECIMAL(10,3)\',$array[\'where\']);

    return $array;
}

SO网友:SwitzerBaden

截至3.8(see track) 精度可以添加到铸造类型,如下所示:

$posts = get_posts(array(
    \'posts_per_page\' => 100,
    \'post_type\' => \'place\',
    \'post_status\' => \'publish\',
    \'meta_query\' => array(
        array(
            \'key\' => \'places_lat\',
            \'value\' => array($lat_min, $lat_max),
            \'compare\' => \'BETWEEN\',
            \'type\' => \'DECIMAL(10,3)\',
        ),
        array(
            \'key\' => \'places_lng\',
            \'value\' => array($lng_min, $lng_max),
            \'compare\' => \'BETWEEN\',
            \'type\' => \'DECIMAL(10,3)\',
        ),
    ),
));

结束

相关推荐