배열을 meta_field로 사용하여 meta_query를 어떻게 만들 수 있습니까?


16

내 쿼리에 대한 인수는 다음과 같습니다.

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
        )
    )
);

이것은 topics문자열 일 때 작동 하지만 배열 일 때는 작동 하지 않습니다 . topics예 를 들어이 쿼리가 작동하도록하고 싶습니다.array( 'sports', 'nonprofit', etc. )

배열을 meta_key로 사용하여 메타 쿼리를 작성하는 방법이 있습니까?


"주제" 의 저장된 값 이 배열 임을 의미 합니까? 또는 저장된 값이 문자열이고 배열의 쿼리에 여러 용어를 전달 하시겠습니까?
MathSmath

@ MathSmath, 나는 저장된 값이 배열임을 의미합니다.
mike23

답변:


31

쿼리에 가능한 값의 배열을 제공

데이터베이스의 값이 문자열이고 쿼리에 여러 값을 제공하려는 경우 :

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => array ( 'sports', 'nonprofit', 'community' ),
            'compare' => 'IN'
        )
    )
);

직렬화 된 데이터 배열에서 특정 값 검색

데이터베이스의 값이 여러 주제의 배열이고 해당 배열 내에서 단일 주제를 검색하려는 경우 (데이터베이스의 배열을 검색 할 수는 있지만 데이터베이스에 직렬화 된 양식으로 존재 함을 참고하십시오. 문자열도) :

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

'LIKE'를 비교 값으로 사용하는 것은 원하는 명령을 명확하게 삭제하지는 않지만 가장 좋은 방법입니다.

그 다음으로 유일한 옵션은 meta_key "topics"가 설정된 모든 게시물을 검색 하여 수동으로 반복하거나 루프 내에서 값을 확인하고 해당 조건에 게시물을 표시하는 것입니다.


14

Johannes의 응답에서 벗어나려면 직렬화 된 배열이므로 사용자 ID와 같은 것을 저장하는 경우 (내 경우) 약간 다르게 처리해야 할 수도 있습니다.

게시물 메타는 다음과 같이 저장되었습니다.

array( "1", "23", "99");

예, 정수이지만 정수를 통해 update_post_meta문자열로 저장되었습니다.

'meta_query' => array(
            array(
                    'key'     => 'my_meta_key',
                    'value'   => serialize( strval( 1 ) ),
                    'compare' => 'LIKE'
                )
            )

따라서 실제로 찾고있는 일련의 문자열 버전과 LIKE 비교를하고 있습니다. 나는 이와 같은 것을 얻으려고 몇 시간을 보냈고 지금까지 이것이 내가 할 수있는 최선이었습니다.


serialize (strval (1)) 내 문제를 해결, 감사
Behzad

우연히이 오래된 대답을 발견했습니다. 나는 당신의 추가를 좋아합니다. +1
Johannes Pille

방금이 문제를 겪었습니다 .user_id가 배열이 아닌 모든 게시물을 가져와야하지만 위의 솔루션이 작동하지 않으므로 다음과 같이 만들었습니다. 'meta_query' => array( array( 'key' => 'my_meta_key', 'value' => ':' . $user_id . ';', 'compare' => 'NOT LIKE' ) ) 직렬화하면 모든 값이 다음과 같이 저장됩니다. :값;'
Bobz

4

@sMyles의 답변에서 또 다른 약간의 개선.

ID가 문자열 (예 : 양식 입력에서 가져올 때)과 정수 (예 :)로 저장 된 경우가 있습니다 update_post_meta($post_id, authorized_users', array(get_current_user_id()));. 이것은 wp_set_object_terms()용어 ID를 사용하여 용어를 설정할 수 있는 잘 알려진 문제와 비슷하지만 정수로 캐스트하지 않으면 해당 숫자를 이름으로하여 새 용어를 만들 확률이 약 50 %입니다. 대신에.

이로 인해 테스트 사이트의 데이터베이스에서 발췌 한 내용에서 볼 수 있듯이 직렬 배열로 상당히 다르게 저장 될 수 있습니다.

a:1:{i:0;s:1:"1";} // 's' for 'string', also note the double quotes
a:1:{i:0;i:1;} // 'i' for 'integer', no quotes

위의 두 가지 방법을 통해 피드 print_r()하면

Array
(
    [0] => 1
)

이 문제를 해결하기 위해 문자열 대신 정수로 값을 캐스팅하는 다른 버전의 쿼리를 meta_query추가 하여 약간의 조정을 수행 했습니다 relation.

최종 결과는 다음과 같습니다.

        'meta_query' => array(
            'relation' => 'OR', // Lets it know that either of the following is acceptable
            array(
                'key' => 'bcm_enm_authorized_users',
                'value'   => serialize(strval(get_current_user_id())), // Saved as string
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'bcm_enm_authorized_users',
                'value'   => serialize(intval(get_current_user_id())), // Saved as integer
                'compare' => 'LIKE'
            ),
        ),

편집 : 이 방법은 배열 색인과 충돌 할 위험이 있음을 깨달았습니다. 따라서 문제가 논의 된 경우 이것이 작동 하지만 더 나은 방법은 검색하려는 값을 저장하기 전에 문자열로 캐스팅하여 @sMyles '메소드를 대신 사용할 수 있도록하는 것입니다.


이것은 가장 신뢰할만한 답변입니다.
Amin

2

나는 Johannes의 대답을 위해 갈 것입니다. 그러나 meta_query를 사용하면 다음과 같은 경우가 발생하기 때문에 개선하고 싶습니다.

당신의 가치는

array('sports','movies', 'sports2');

당신이 검색 할 때

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports',
            'compare' => 'LIKE'
        )
    )
);

결과는 'sport'와 'sport2'를 모두 반환합니다.

이를 해결하려면 meta_query args를

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        array(
            'key' => 'topics',
            'value' => 'sports";',
            'compare' => 'LIKE'
        )
    )
);

데이터베이스에서 값이 직렬화되고 각 항목이 세미콜론으로 구분되기 때문입니다. 따라서 위의 args가 작동합니다.

값의 항목이 숫자 인 경우 큰 따옴표 "

$args = array(
        'post_type' => 'news',
        'meta_query' => array(
            array(
                'key' => 'topics',
                'value' => '1;',
                'compare' => 'LIKE'
            )
        )
    );

1

나는 오늘 비슷한 것을 가지고 놀았다. 여러 관련 사용자 (배열)와 ACF (Advanced Custom Fields) 관계 필드를 쿼리해야합니다.

PHP를 통해 필드를 업데이트 한 후 쿼리가 작동하지 않았습니다. ACF UI를 통해 업데이트 한 후 쿼리가 작동했습니다.

문제는 내 PHP 코드가 관계 값을 정수 값으로 설정하고 UI가 문자열 값으로 설정한다는 것입니다. 두 가지 작동을 보장하기 위해 지금이 쿼리를 사용합니다 (여기 예제에 적합).

$args = array(
    'post_type' => 'news',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'topics',
            'value' => '1;',  // works for int-array
            'compare' => 'LIKE'
        ),
        array(
            'key' => 'topics',
            'value' => '"1"',  // works for string-array
            'compare' => 'LIKE'
        ),
    )
);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.