하나의 맞춤 입력란으로 필터링하고 다른 맞춤 입력란으로 주문 하시겠습니까?


10

사용자 정의 게시물 유형 "Listing"이 있고 사용자 정의 field가있는 모든 Listings를 가져 gateway_value != 'Yes'오고 다른 사용자 정의 필드별로 결과를 정렬하려고합니다 location_level1_value. 쿼리를 개별적으로 작동시킬 수는 있지만 조합 할 수는 없습니다.

쿼리 1 (위치별로 정렬) :

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );

쿼리 2 (사용자 정의 필드 값! = 예) :

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_key' => 'gateway_value',
                    'meta_value' => 'Yes',
                    'meta_compare' => '!=',
                    'paged' => $paged
                    )
                );

결합 된 쿼리 :

이에 대한 도움을 얻기 위해 코덱 을 살펴 보았지만 다음 쿼리는 작동하지 않습니다.

                $wp_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'posts_per_page' => '9',
                    'post_status' => 'publish',
                    'meta_query' => array(
                        array(
                            'key' => 'gateway_value',
                            'value' => 'Yes',
                            'compare' => '!='
                        ),
                        array(
                            'key' => 'location_level1_value'
                        )
                    ),
                    'orderby' => "location_level1_value",
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                );

결합 된 쿼리에서 내가 뭘 잘못하고 있습니까?

[업데이트] : 이제 3.1이 릴리스되었으므로 위의 결합 된 쿼리는 여전히 작동하지 않습니다. 나는 정확하게 정렬되지 않은 결과를 얻습니다.

[업데이트] : var_dump($wp_query->request)다음을 제공합니다.
string(527) " SELECT SQL_CALC_FOUND_ROWS wp_7v1oev_posts.* FROM wp_7v1oev_posts INNER JOIN wp_7v1oev_postmeta ON (wp_7v1oev_posts.ID = wp_7v1oev_postmeta.post_id) INNER JOIN wp_7v1oev_postmeta AS mt1 ON (wp_7v1oev_posts.ID = mt1.post_id) WHERE 1=1 AND wp_7v1oev_posts.post_type = 'listing' AND (wp_7v1oev_posts.post_status = 'publish') AND wp_7v1oev_postmeta.meta_key = 'gateway_value' AND CAST(wp_7v1oev_postmeta.meta_value AS CHAR) != 'Yes' AND mt1.meta_key = 'location_level1_value' ORDER BY wp_7v1oev_posts.post_date DESC LIMIT 0, 9"


3
WordPress 3.1을 사용하고 있습니까? 이 meta_query매개 변수는 3.1에서 새로 출시되었지만 곧 출시 될 예정이지만이 안정적인 매개 변수없이 현재 안정적인 버전은 여전히 ​​3.0.5입니다.
Jan Fabry

어 ... 맞아, 아마 그럴 것이다. 3.0.5에서 작동하게하는 방법은 무엇입니까?
gillespieza

Miljenko는 당신 대신에 그의 대답을 받아 들여야합니다.
휴고

답변:


9

필터링 옵션과 함께 'meta_query'를 사용하여 원하는대로 쿼리를 사용하여 컨텐츠를 필터링 할 수 있으며 주문 부분에 대해 다음 매개 변수를 추가 / 수정하십시오.

  • 'orderby'=> 'meta_value'
  • 'meta_key'=> 'location_level1_value'
  • 'order'=> 'ASC'

    $wp_query = new WP_Query( array (
        'post_type'      => 'listing',
        'posts_per_page' => '9',
        'post_status'    => 'publish',
        'meta_query'     => array(
            array(
                'key'       => 'gateway_value',
                'value'     => 'Yes',
                'compare'   => '!='
            )
        ),
        'orderby'  => 'meta_value',            // this means we will be using a selected 
                                               // meta field to order
    
        'meta_key' => 'location_level1_value', // this states which meta field 
                                               // will be used in the ordering, 
                                               // regardless of the filters
        'order'    => 'ASC',
        'paged'    => $paged
        )
    );

2

Jan이 새로운 WordPress 3.1에서 말했듯이 사용할 수는 meta_query있지만 첫 번째 쿼리를 사용하여 루프 내부를 정렬하고 필터링 할 수 있습니다.

 Global $my_query;
$my_query = new WP_Query( array (
                    'post_type' => 'listing',
                    'post_status' => 'publish',
                    'posts_per_page' => '9',
                    'meta_key' => 'location_level1_value',
                    'orderby' => 'location_level1_value',
                    'order' => 'ASC',
                    'paged' => $paged
                    )
                 );
while ($my_query->have_posts){
    $my_query->the_post();
              //do your loop stuff
} 

이 코드를 함수에 추가하십시오.

   //join filter
         add_filter('posts_join', 'listing_join_865' );
         function listing_join_865($join){
Global$ my_query;            
if ('listing' = $my_query->query['post_type']){
                $restriction1 = 'gateway_value';
                return $join .="
                LEFT JOIN $wpdb->postmeta AS $restriction1 ON(
                $wpdb->posts.ID = $restriction1.post_id
                AND $restriction1.meta_key = '$restriction1'
                )";
             }else {
                return $join;
            }
         }
         //where filter
         add_filter('posts_where', 'listing_where_865' );
         function listing_where_865($where){
             global $my_query;
            if ('listing' = $my_query->query['post_type']){
                return $where.= " AND $restriction1.meta_value != 'yes'";
            }else{
                return $where;
            }
         }

이제 이것이 작동합니다.


고마워 페이징이 더 이상 제대로 작동하지 않는 이상한 부작용이 있다는 점을 제외하고는 효과가 있습니다. 페이지 당 9 개 대신 그리드에 "빈 지점" gateway_value == "Yes"이있어 조건부없는 사용자 지정 게시물이 있습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
gillespieza

그래도 페이징을 망칠 수 있으므로 주변의 유일한 방법은 사용자 지정 SQL 쿼리 일 것입니다. 몇 분만 기다려주세요.
Bainternet

걱정하지 마십시오-두 번째 쿼리를 사용하고 3.1이 출시 될 때까지 플러그인 wordpress.org/extend/plugins/post-types-order를 사용합니다 :)
gillespieza

댐, 나는 해결책을 찾은 후에 당신의 의견을 보려고 지금 막 돌아 왔습니다. 어쨌든 그것은 미래의 요청자를 위해 여기에 있습니다.
Bainternet

1
@ t31os-나는 보통 그렇게하지만 내 휴대 전화에서 응답하지 않습니다.
Bainternet

1

내 자신의 질문에 대한 답변 :

[http://core.trac.wordpress.org/ticket/15031][1]을 보면 알려진 문제인 것 같습니다. 을 사용하여 작동하도록 수정했습니다 (해킹 되었습니까?) post_filter(동일한 답변을 검색하는 사람에게만 해당).

functions.php ###에서

add_filter('posts_orderby', 'EV_locationl1' );
function EV_locationl1 ($orderby) {
    global $EV_locationl1_orderby;
    if ($EV_locationl1_orderby) $orderby = $EV_locationl1_orderby;
    return $orderby;
}

템플릿 파일 ###에서 수정 된 wp_query

$EV_locationl1_orderby = " mt1.meta_value ASC";

$wp_query = new WP_Query( array (
    'post_type' => 'listing',
    'posts_per_page' => '9',
    'post_status' => 'publish',
    'meta_query' => array(
            array(
                    'key' => 'gateway_value',
                    'value' => 'Yes',
                    'compare' => '!='
                    ),
            array(
                    'key' => 'location_level1_value'
            )
        ),
    'order' => $EV_locationl1_orderby,
    'paged' => $paged
    ));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.