具有多值数组的WordPress元查询

时间:2016-12-27 13:13:10

标签: wordpress posts

我有以下查询,我想将值数组传递给:

$data = get_posts( array(
    'post_type'   => 'custom_type',
    'post_status' =>  'any',
    'posts_per_page' => 200,
    'meta_query' => array(
    array(
     'key'     => '_customer_names',
     'value'   => $customer_names,
     'compare' => '='
        ),
    array(
     'key'     => '_customer_dates',
     'value'   => $customer_dates,
     'compare' => 'LIKE'
            )
        )
    )
);

例如,我想这样传递:

$customer_names = array('John','Tom', 'Simon');
$customer_dates = array('20161225', '20161225', '20161225');

查询还需要处理所有客户可能拥有每个日期数据的可能性。在伪SQL中,我最好的猜测是:

SELECT * FROM WORDPRESS_POSTS WHERE _customer_names = (John OR Tom OR Simon) AND customer_dates = (20161225 OR 20161226 OR 20161227)

但是,目前,即使我删除了日期限制,我也找不到任何帖子。因此,我想确认我的逻辑是正确的。

3 个答案:

答案 0 :(得分:0)

试试这样:

$data = get_posts( array(
    'post_type'   => 'custom_type',
    'post_status' =>  'any',
    'posts_per_page' => 200,
    'meta_query' => array(
             'relation' => 'AND',
            array(
                'relation' => 'OR',
                array(
                    'key' => '_customer_names',
                    'value' => 'John',
                    'compare' => '='
                ),

                array(
                    'key' => '_customer_names',
                    'value' => 'Tom',
                    'compare' => '='
                ),

                array(
                    'key' => '_customer_names',
                    'value' => 'Simon',
                    'compare' => '='
                )
            ),

            array(
                'relation' => 'OR',
                array(
                    'key' => '_customer_dates',
                    'value' => '20161225',
                    'compare' => '='
                ),

                array(
                    'key' => '_customer_dates',
                    'value' => '20161225',
                    'compare' => '='
                ),

                array(
                    'key' => '_customer_dates',
                    'value' => '20161225',
                    'compare' => '='
                )
            ),
        )
    )
);

答案 1 :(得分:0)

如果要在值中使用数组,则需要将compareIN子句一起使用。

如果您想要与精确值匹配,可以试试@Ravendra Patel的解决方案。

同样使用WP_QUERY,因为它附带主要查询,并提供更多帮助来识别问题

$customer_names = array('John', 'Tom', 'Simon');
$customer_dates = array('20161225', '20161225', '20161225');
$args           = array(
    'post_type'      => 'custom_type',
    'post_status'    => 'any',
    'posts_per_page' => 200,
    'meta_query'     => array(
        array(
            'key'     => '_customer_names',
            'value'   => $customer_names,
            'compare' => 'IN'
        ),
        array(
            'key'     => '_customer_dates',
            'value'   => $customer_dates,
            'compare' => 'IN'
        )
    )
);
$query          = new WP_QUERY($args);
echo 'SQL: '.$query->request.'<br>'; // your query against args

答案 2 :(得分:0)

尝试这样:

$customer_names = array('John', 'Tom', 'Simon');
$customer_dates = array('20161225', '20161225', '20161225');

$cm_metaq = array();
foreach($customer_names as $cm){
    $cm_metaq[] = array('key' => '_customer_names', 'value' => $cm, 'compare' => '=');
}
$cd_metaq = array();
foreach($customer_dates as $cd){
    $cd_metaq[] = array('key' => '_customer_dates', 'value' =>$cd,  'compare' => '=');
}


$data = get_posts( array(
    'post_type'   => 'custom_type',
    'post_status' =>  'any',
    'posts_per_page' => 200,
    'meta_query' => array(
             'relation' => 'AND',
            array(
                'relation' => 'OR',
                 $cm_metaq
            ),

            array(
                'relation' => 'OR',
                $cd_metaq
            ),
        )
    )
);