为什么Wordpress会忽略meta_query条件?

时间:2016-06-29 13:45:34

标签: php wordpress

有两个元条件的简单查询。

$defaults = array(
    'post_type' => 'products',
    'orderby'   => 'date',
    'order'     => 'DESC',
);

if($is_deadline) { // true, I checked
    $defaults['meta_key'] = 'deadline',
    $defaults['meta_type'] = 'NUMERIC',
    $defaults['meta_value'] = (int)current_time( 'Ymd' );
    $defaults['meta_compare'] = '>=';

    $defaults['meta_query'] = array( // this query will be ignored
        'relation' => 'OR',
        array(
            'key'     => 'deadline',
            'value'   => '',
            'compare' => '='
        )
    );
}

但我有问题:Wordpress忽略了meta_query块。换句话说,$ query->请求看起来像这样(不与空字符串比较):

SELECT adveq_posts.* FROM adveq_posts
INNER JOIN adveq_postmeta ON ( adveq_posts.ID = adveq_postmeta.post_id ) WHERE 1=1  
AND ( 
  ( adveq_postmeta.meta_key = 'deadline' AND CAST(adveq_postmeta.meta_value AS SIGNED) >= '20160629' )
) 
AND adveq_posts.post_type = 'products' 
AND (adveq_posts.post_status = 'publish' 
OR adveq_posts.post_status = 'private') 
GROUP BY adveq_posts.ID 
ORDER BY adveq_posts.post_date DESC 

如果我将关系设置为'AND',则此问题会消失 - meta_query不再被忽略。但我需要OR,而不是AND。我尝试了另一种变体,仅使用meta_query。

$defaults = array(
    'post_type' => 'products',
    'orderby'   => 'date',
    'order'     => 'DESC',
);

if($is_deadline) { // true, I checked
    $defaults['meta_query'] = array(
        'relation' => 'OR',
        array(
            'key'     => 'deadline',
            'value'   => (int)current_time( 'Ymd' ),
            'type'    => 'NUMERIC',
            'compare' => '>='
        ),
        array(
            'key'     => 'deadline',
            'value'   => '',
            'compare' => '='
        )
    );
}

但是,在这种情况下,Wordpress会尽可能地忽略meta_query。即使关系='AND',问题仍然存在且WP行为完全相同。

SELECT adveq_posts.* FROM adveq_posts 
WHERE 1=1  AND adveq_posts.post_type = 'structured_products' 
AND (adveq_posts.post_status = 'publish' OR adveq_posts.post_status = 'private') 
ORDER BY adveq_posts.post_date DESC

有什么建议吗?也许这是一个WP核心bug?这种行为非常奇怪且不合逻辑。

2 个答案:

答案 0 :(得分:1)

这不会直接起作用。你需要在这里使用WP_Meta_Query。

阅读以下内容 https://codex.wordpress.org/Class_Reference/WP_Meta_Query

答案 1 :(得分:0)

这个问题的问题是我自己的错误。我使用过滤器修改wp_query逻辑,这些修改破坏了正常行为。如果你有类似的问题,请确保你或任何插件\主题没有使用过滤器(f.e.pre_get_posts或任何其他)可以改变WP_Query的结果。

但是,如果你需要结合这个逻辑并获得WP_Query的全部好处,你可以在WP_Query构造函数中传递自己的标志,然后检查它的状态。例如:

$query = new WP_Query(array(
    'post_type'            => 'any_post_type',
    'orderby'              => 'date',
    'order'                => 'DESC',

    'suppress_filters'     => false,

    'is_your_custom_query' => true, // your custom flag
));