当前位置: 首页>>网站问题>>正文


嵌套的meta_query具有多个关系键

webfans 网站问题 , , , , , 去评论

问题描述

我很好奇Wordpress是否能够运行嵌套的meta_query,每个都有不同的关系键?从Wordpress 3.0开始,tax_query就可以执行此功能;我想知道这是否与meta_query等效。

$results = query_posts( array(
    'post_type' => 'event_id',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'relation' => 'OR',
            array(
                'key' => 'primary_user_id',
                'value' => $user_id
            ),
            array(
                'key' => 'secondary_user_id',
                'value' => $user_id
            )
        ),
        array(
            'key' => 'date',
            'value' => array( $start_date, $end_date ),
            'type' => 'DATETIME',
            'compare' => 'BETWEEN'
        )
    )
) );

参考文献:

最佳解决方案

问题出在Wordpress 3.0上,但万一有人对Wordpress Codex的更新版本提出了同样的问题:

“Starting with version 4.1, meta_query clauses can be nested in order to construct complex queries.”

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

因此,该查询应该适用于当前的Wordpress版本。

次佳解决方案

这似乎是不可能的。如果我错了,请有人纠正我。

meta_query参数实际上将转换为WP_Meta_Query对象,relation验证在wp-includes/meta.php中不会更深入,并且在顶层只发生一次:

if ( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) {
    $this->relation = 'OR';
} else {
    $this->relation = 'AND';
}

一个可能的解决方案是为此查询构建自己的JOIN。

$query = new WP_Query( array(
    ...
    'my_meta_query' => true,
    'suppress_filters' => false
) );

add_filter( 'posts_join', 'my_meta_query_posts_join', 10, 2 );
function my_meta_query_posts_join( $join, $query ) {

    if ( empty( $query->query_vars['my_meta_query'] ) )
        return $join;

    global $wpdb;

    $new_join = "
        INNER JOIN {$wpdb->postmeta} pm1 ON 1=1
            AND pm1.post_id = {$wpdb->posts}.ID
            AND pm1.meta_key = '_some_meta_key'
            AND pm1.meta_value = 'some_value'
    ";

    return $join . ' ' . $new_join;
}

如果您需要进一步的验证和规则,您还可以使用posts_where过滤器。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2016.html,转载请务必附带本地址声明。