programing

wp_query에서 복잡한 계산 또는 조건부 필드로 주문하려면 어떻게 해야 합니까?

newstyles 2023. 6. 13. 22:03

wp_query에서 복잡한 계산 또는 조건부 필드로 주문하려면 어떻게 해야 합니까?

wp_query에서 조건부 또는 계산된 필드별로 주문할 수 있도록 복잡한 쿼리를 작성할 수 있습니까?제가 하려는 것은 MySql의 다음 쿼리와 같은 것입니다.

SELECT *, field1, field2
  case when field1+field2 > some_value then 1 else 2 end as my_alias
FROM my_table
ORDER BY my_alias ASC

wp_query를 사용하여 이와 같은 쿼리를 구축하고 싶은데 가능한가요?만약 그렇다면, 어떻게 그것을 달성할 수 있습니까?

네, 그렇게 해야 합니다.

  • https://developer.wordpress.org/reference/hooks/posts_fields/ 을 사용하여 사용자 지정 필드 추가

  • https://developer.wordpress.org/reference/hooks/posts_orderby/ 을 사용하여 사용자 지정 주문 추가

나는 이것을 싱글로 할 방법이 없다고 생각합니다.WP_Query~하듯이meta_query세 개의 고유 쿼리를 수행한 다음 병합할 수 있지만(테스트되지 않은 코드) 이러한 유연성은 허용되지 않습니다.

// Get ongoing events
$ongoing = new WP_Query(array(
    'post_type' => 'event',
    'meta_key' => 'date_from',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'date_from',
            'value' => date('Y-m-d'),
            'compare' => '<=',
            'type' => 'DATE'
        ),
        array(
            'key' => 'date_to',
            'value' => date('Y-m-d'),
            'compare' => '>=',
            'type' => 'DATE'
        )
    )
));
foreach($ongoing as $key => $ongoing_post) {
    $ongoing_post->event_status = 'ongoing';
    $ongoing[$key] = $ongoing_post;
}

// Get upcoming events
$upcoming = new WP_Query(array(
    'post_type' => 'event',
    'meta_key' => 'date_from',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'meta_query' => array(
        array(
            'key' => 'date_from',
            'value' => date('Y-m-d'),
            'compare' => '>',
            'type' => 'DATE'
        )
    )
));
foreach($upcoming as $key => $upcoming_post) {
    $upcoming_post->event_status = 'upcoming';
    $upcoming[$key] = $upcoming_post;
}

// Get past events
$past = new WP_Query(array(
    'post_type' => 'event',
    'meta_key' => 'date_from',
    'orderby' => 'meta_value',
    'order' => 'DESC',
    'meta_query' => array(
        array(
            'key' => 'date_to',
            'value' => date('Y-m-d'),
            'compare' => '<',
            'type' => 'DATE'
        )
    )
));
foreach($past as $key => $past_post) {
    $past_post->past_status = 'past';
    $past[$key] = $past_post;
}

// Merge'em all
$events = array_merge($ongoing, $upcoming, $past);

메타 값을 실제 날짜와 비교하는 데 사용합니다(저장 방법에 따라 날짜 형식을 변경할 수 있습니다).date_from그리고.date_to필드), 그리고 오른쪽이 있는 모든 게시 개체에 속성을 추가하려면 바로 루프를 수행합니다.event_status게시물을 표시할 때 사용할 수 있습니다.

WP_Query 필터를 통해 이를 달성할 수 있는 영리한 방법이 있을 수 있지만 내부에서 더 심층적인 조사가 필요합니다.WP_Query소스 코드는 코덱스 내부에 실제로 문서화되어 있지 않기 때문입니다.

당신이 사용하는 것, 그리고 이것을 시도해 보세요.

<?php
    global $wpdb;
    $result = $wpdb->get_results("SELECT *, field1, field2 case when field1+field2 > some_value then 1 else 2 end as my_alias FROM my_table ORDER BY my_alias ASC");
    print_r($result);
?>

여기를 클릭하십시오.

언급URL : https://stackoverflow.com/questions/33209880/in-wp-query-how-can-i-order-by-a-complex-calculated-or-conditional-fields