自定义WP_Query无法正常工作

时间:2016-09-08 19:46:22

标签: php wordpress

我尝试使用自定义WP_Query,但结果不对。

我想要做的是创建一个自定义表单来过滤使用" WP Job Manager"注册的作业。使用半径搜索。

这是我的疑问:

$args = array(
'post_type'    => 'job_listing',
'post_status'  => array( 'publish' ),
    'meta_query' => array(
        'relation' => 'AND',
            array(
                'key' => 'geolocation_long',
                'value'   => array($maxLong,$minLong),
                'compare' => 'between',
                'type'      => 'numeric',
            ),
            array(
                'key'     => 'geolocation_lat',
                'value'   => array($maxLat,$minLat),
                'compare' => 'between',
                'type'      => 'numeric',
            ),
        ),
    );

$the_query = new WP_Query( $args );

你能发现任何问题吗?

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

这可能是比较BETWEEN功能的问题。我建议您查看生成的确切查询以及比较是否实际比较浮动,而不是字符串(这可能会产生意外结果)。

wordpress.stackexchange.com上查看针对非常类似查询所做的故障排除。

以下是问题引用:

  

由于postmeta值存储为字符串,我认为我应该转换为DECIMAL,但由于缺少DECIMAL参数/精度参数,它似乎只是修剪了字符串中的十进制值。

并查看Rarst的回答:

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

通过在查询中添加以下内容,为get_posts()启用过滤器:

'suppress_filters' => false,

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;
}

请注意OP对此建议的评论:

  

尝试了两种解决方案,看起来它们将它们作为字符串与单引号(wp 3.1.1)进行比较,对此有什么想法?尝试原始的SQL确实工作。

请使用进一步的调查结果更新您的问题,以便我们为您提供帮助。

答案 1 :(得分:0)

更改$ minlong和$ maxlong

$args = array(
'post_type'    => 'job_listing',
'post_status'  => array( 'publish' ),
    'meta_query' => array(
        'relation' => 'AND',
            array(
                'key' => 'geolocation_long',
                'value'   => array($minLong,$maxLong),
                'compare' => 'between',
                'type'      => 'numeric',
            ),
            array(
                'key'     => 'geolocation_lat',
                'value'   => array($minLat,$maxLat),
                'compare' => 'between',
                'type'      => 'numeric',
            ),
        ),
    );

$the_query = new WP_Query( $args );