programing

meta_query를 사용한 복잡한 custom_field 검색

codeshow 2023. 3. 8. 21:36
반응형

meta_query를 사용한 복잡한 custom_field 검색

배경

Advanced Custom Fields Pro를 사용하여 커스텀필드를 관리하고 있는데, 이 필드에는 다음과 같이 저장된 하위 필드가 포함된 "repeater" 필드가 있습니다.repeatername_X_fieldname여기서 X는 리피터의 행 번호입니다.

커스텀 투고 타입이 있습니다.student리피터가 있고attendance그 안에date그리고.class.

그래서 학생이 수업에 참석할 때 다음과 같이 출석률을 저장합니다.

  • meta_key: '출석_X_date' meta_value: '20170701'
  • meta_key: '출석_X_class' meta_value: '역사 101'

특정 수업에 다녀온 적이 있거나 특정 날짜 범위 내에 출석한 학생을 검색하려면 에 접속해야 합니다.get_meta_sql그리고 나의 변환하다meta_query사용하다LIKE대신=값이 다음을 포함하는 경우%

function key_rewrite($parts){
    foreach($parts as &$part){
        $part = preg_replace("/(meta_key = )(\'[^']*[%][^']*\')/", "meta_key LIKE $2", $part);
    }
    return $parts;
}
add_action( 'get_meta_sql', 'key_rewrite');

이렇게 하면 이렇게 할 수 있어요.

$args = array(
    'post_type' => 'student',
    'meta_query' => array(
        array(
            'key'=>'attendance_%_class',
            'compare'=>'=',
            'value'=>'History 101'
        )
    )
);
$my_query = new WP_Query($args);

History 101 OR에 참석한 적이 있는 사람을 찾기 위해

$args = array(
    'post_type' => 'student',
    'meta_query' => array(
        array(
            'key'=>'attendance_%_date',
            'compare'=>'>=',
            'value'=>'20170101'
        )
    )
);

올해 참석한 사람을 찾기 위해.

문제 파트 1

올해 '역사 101'에 참석한 적이 있는 사람을 찾을 수 있어야 해요.

처음에는 meta_query의 단순한 AND로 다음과 같은 효과를 얻을 수 있을 것으로 생각됩니다.

$args = array(
    'post_type' => 'student',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key'=>'attendance_%_class',
            'compare'=>'=',
            'value'=>'History 101'
        ),
        array(
            'key'=>'attendance_%_date',
            'compare'=>'>=',
            'value'=>'20170101'
        )
    )
);

그러나 와일드카드는 연계되어 있지 않기 때문에 작년에 '역사 101'에 다녔던 사람이 돌아올 수 있지만 올해는 다른 수업을 들을 수 있다.

문제 파트 2

올해 'History 101'에 참석했지만 지난 한 주 동안 수업에 전혀 나오지 않은 모든 사람들의 명단을 구할 수 있어야 해요.meta_query를 조합해야 하기 때문에 이 문제는 더욱 복잡해집니다.EXISTS그리고.NOT EXISTS추가 조건을 붙여서표면적으로는 nested meta_queries를 사용하면 매우 단순하게 들립니다.

$args = array(
    'post_type' => 'student',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'relation' => 'AND',
            array(
                //Just assume by some magic we resolved Problem part 1
                'key'=>'attendance_%_class',
                'compare'=>'=',
                'value'=>'History 101'
            ),
            array(
                'key'=>'attendance_%_date',
                'compare'=>'>=',
                'value'=>'20170101'
            )
        ),
        array(
            'relation' => 'AND',
            array(
                //again... magic!
                'key'=>'attendance_%_class',
                'compare'=>'=',
                'value'=>'History 101'
            ),
            array(
                'key'=>'attendance_%_date',
                'compare'=>'>',
                'value'=>'20170821'
            ),
            array(
                'key'=>'attendance_%_date',
                'compare'=>'NOT EXISTS'
            )
        )
    )
);

이 문제는 논리적인 문제와 관련이 있는 것은 분명하지만 WordPress는 메타 쿼리에서 사용할 때마다 포스트메타 테이블에 참여함으로써 대부분의 문제를 해결합니다.아쉽게도 이는 > 날짜 부분이 에서는 사용되지 않음을 의미합니다.NOT EXISTS ON따라서 를 사용할 수 없습니다.IS NULL존재하지 않는지를 테스트합니다.

저는 이것이 매우 복잡하다는 것을 알고 있으며, 만약 당신이 저를 팔로우해 주신다면, 저는 매우 감명받았습니다.그렇지 않은 경우, 제가 명확하게 할 수 있도록 질문해 주십시오.

네, 저는 저만의 쿼리를 완전히 작성할 수 있다는 것을 알고 있지만, WordPress 내장 툴을 계속 사용하려고 합니다.

도와주세요!

나도 가봤는데...모든 것을 하나의 복잡한 메타 쿼리에 넣으려고 합니다.마지막으로 생성된 SQL을 수동으로 처리해야 합니다. 이동 괄호, 연산자, 견적서 교체 등입니다.

하며, "JOIN"에 .postmeta이치노

저는 약간 다른 접근방식을 선택함으로써 이 목표를 달성하기로 했습니다.때문에 에 쿼리와 하면 됩니다.post__in ★★★★★★★★★★★★★★★★★」post__not_in,

: 문제 파트 1:

/* Filter by class */
$history_students_ids = get_posts(array(
    'post_type'      => 'student',
    'fields'         => 'ids',
    'posts_per_page' => -1,
    'meta_query'     => array(
        array(
            'key'=>'attendance_%_class',
            'compare'=>'=',
            'value'=>'History 101'
        ),
    )
));

/* Filter by date */
$students = get_posts(array(
    'post_type' => 'student',
    'post__in' => $history_students_ids,
    'meta_query' => array(
        array(
            'key'=>'attendance_%_date',
            'compare'=>'>=',
            'value'=>'20170101'
        )
    )
));

문제 파트 2도 마찬가지입니다.

$not_attended_history_students_ids = get_posts(array(
    'post_type' => 'student',
    'post__in' => $history_students_ids,
    'fields'         => 'ids',
    'posts_per_page' => -1,
    'meta_query' => array(
        array(
            'key'=>'attendance_%_date',
            'compare'=>'NOT EXISTS'
        )
    )
));

$students = get_posts(array(
    'post_type' => 'student',
    'post__in' => $not_attended_history_students_ids,
    'meta_query' => array(
        array(
            'key'=>'attendance_%_date',
            'compare'=>'>=',
            'value'=>'20170101'
        )
    )
)); 

를 사용할 수 .post__not_in이 그 ...당신이 그 생각을 이해하셨기를 바랍니다.

언급URL : https://stackoverflow.com/questions/45928591/complex-custom-field-search-with-meta-query

반응형