여러 관계 키가있는 중첩 된 meta_query


18

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'
        )
    )
) );

참고 문헌 :

답변:



9

불가능 해 보입니다. 내가 틀렸다면 누군가 나를 수정하십시오.

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필터 를 사용할 수도 있습니다 .


3
: 코어 Trac의에 권장 @scribu 같은 방법이 될 것 같습니다 core.trac.wordpress.org/ticket/20312
앤드류 오드리

@AndrewOdri 그것은 동일하지만 =) 아닙니다
vmassuchetto

1

한편 이것이 가능합니다. 예제와 설명이있는 설명서를 참조하십시오.

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

그리고 다른 예는 https://wordpress.org/support/topic/wp_query-with-multiple-meta_query/#post-9410992

'meta_query'  => array(
    'relation' => 'OR',
    array(
        'relation' => 'AND',
        array(
            'key'     => '_price',
            'value'   => 1,
            'compare' => '>=',
            'type' => 'DECIMAL',
        ),
        array(
            'key'     => '_price',
            'value' <= 3000,
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    ),
    array(
        'relation' => 'AND',
        array(
            'key'     => '_price',
            'value'   => 3001,
            'compare' => '>=',
            'type' => 'DECIMAL',
        ),
        array(
            'key'     => '_price',
            'value' <= 6000,
            'compare' => '<=',
            'type' => 'DECIMAL',
        ),
    )
),
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.