여러 메타 키 값을 쿼리 하시겠습니까?


22

동일한 키로 여러 메타 키 값을 쿼리하는 방법

$querystr = "  
            SELECT $wpdb->posts.* 
            FROM $wpdb->posts, $wpdb->postmeta
            WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 

            AND $wpdb->postmeta.meta_key = 'key1'   
            AND $wpdb->postmeta.meta_value = 'value1'
            // why doesn't this work?
            AND $wpdb->postmeta.meta_value = 'value2'

            AND $wpdb->posts.post_status = 'publish' 
            AND $wpdb->posts.post_type = 'post'
            ORDER BY $wpdb->posts.post_date DESC
                ";

다음 코드

<?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
// this array results in no return for both arrays
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$the_query  = new WP_Query( $args );
 ?>

                <?php /* Start the Loop */ ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

                    <?php get_template_part( 'content', get_post_format() ); ?>

                <?php endwhile; ?>

답변:


31

나는 여기에 AND / OR 혼란이 있다고 생각합니다.

OP의 쿼리는 key1 = 'value1'및 key2 = 'value2' 가 모두 있는 게시물 만 반환 합니다. 대부분의 WP 플러그인 (어쨌든 내가 아는)은 동일한 키를 사용하여 동일한 게시물에 대해 postmeta에 여러 값을 저장하지 않습니다.

원하는 것이 실제로 OR 인 경우 (key1 = 'value2'인 게시물뿐만 아니라 key1 = 'value2'인 게시물을 얻으려는 경우) 'IN'및 값 배열을 사용하여 @WhiskerSandwich의 답변을 참조하십시오 value 매개 변수

또는 relation`meta_query '에 매개 변수를 제공 할 수 있습니다 :

$args = array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),

        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);

동일한 키를 사용하는 여러 메타 쿼리의 관계로 OR을 사용하는 IN것은 단일 키를 사용하는 것과 기능적으로 동등한 기능 입니다.


이것에 감사합니다, 분 나는 "관계"매개 변수가 존재하는지 몰랐다. 나를 도와주었습니다.
MathSmath

검색 할 키가 하나만있는 경우 작동합니다. 둘 이상인 경우 'AND'를 사용하여 관계 매개 변수에 결합해야 할 수 있습니다.이 경우 아래 @WhiskerSandwich의 대답이 더 적합합니다.
SinisterBeard

14

동일한 키에 여러 배열을 전달해도 작동하지 않는 동일한 문제가있었습니다. 대신 하나의 배열을 사용하고 'value'를 값의 배열로 설정하고 'compare'를 IN으로 설정하십시오.

<?php

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => array('value1', 'value2'),
            'compare' => 'IN'
        ),
    )
);
$query = new WP_Query( $args );

?>

1

postmeta 테이블의 별칭을 두 번째 값으로 지정해야합니다.

$querystr = "  
        SELECT $wpdb->posts.* 
        FROM $wpdb->posts, $wpdb->postmeta, $wpdb->postmeta AS mt1
        WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 

        AND $wpdb->postmeta.meta_key = 'key1'   
        AND $wpdb->postmeta.meta_value = 'value1'
        AND mt1.meta_key = 'key1'
        AND mt1.meta_value = 'value2'

        AND $wpdb->posts.post_status = 'publish' 
        AND $wpdb->posts.post_type = 'post'
        ORDER BY $wpdb->posts.post_date DESC
            ";

3.1 이후로 다음을 수행 할 수도 있습니다 meta_query.

$args = array(
    'meta_query' => array(
        array(
            'key' => 'key1',
            'value' => 'value1',
            'compare' => '='
        ),
        array(
            'key' => 'key1',
            'value' => 'value2',
            'compare' => '='
        )
    )
);
$query = new WP_Query( $args );

답변 해 주셔서 감사합니다. SQL은 값을 리턴하지 않습니다. 그리고 배열에서 두 번째 키와 값을 제거하지 않으면 배열은 값을 반환하지 않습니다. 이것이 버그가 있습니까?
STEEN

@ steen-문제가 무엇인지 잘 모르겠습니다. 두 방법을 모두 테스트했으며 3.3.1 설치에서 작동합니다. 키가 문자 그대로 'key1'이고 값이 'value1'및 'value2'입니까? print_r( $the_query );쿼리 직후에 아무것도 보이지 않습니까?
Milo

0

키는 key1이고 값 'value1'및 'value2'는 새로 설치 한 11 개의 텍스트와 숫자를 모두 시도했습니다. print_r ($ the_query); 작품 출력이 정상적으로 보입니다. 시도한 key1 및 key2도 작동하지 않습니다. 하나의 배열로 제한하자마자 작동합니다. 다른 브라우저로 확인했습니다.

그러나 이것은 효과가 있습니다.

    <?php 
$args = array(
    'meta_query' => array(
        array(
            'key' => 'wtf',
            'value' => '1',
            'compare' => '>='
        ),
// this array results in no return for both arrays
        array(
            'key' => 'wtf',
            'value' => '2',
            'compare' => '<='
        )
    )
);
$the_query  = new WP_Query( $args );

 ?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.