กรองตามฟิลด์ที่กำหนดเองหนึ่งสั่งโดยฟิลด์อื่น?


10

ฉันมีการโพสต์ที่กำหนดเองพิมพ์ "รายชื่อ" และฉันต้องการที่จะได้รับรายชื่อทั้งหมดที่มีข้อมูลที่กำหนดเองและเพื่อผลการค้นหาในช่องที่กำหนดเองอีก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
                    )
                );

ข้อความค้นหาแบบรวม:

ฉันดูCodexเพื่อขอความช่วยเหลือในเรื่องนี้ แต่การสืบค้นต่อไปนี้ใช้ไม่ได้:

                $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 มีคำตอบที่ดีที่สุดที่คุณควรยอมรับเขาแทนที่จะเป็นของคุณ
Hugo

คำตอบ:


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

อย่างที่แจนพูดใน 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
} 

และเพิ่มรหัสนี้ลงใน functions.php ของคุณ

   //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

ไม่ต้องกังวล - ฉันจะใช้ข้อความค้นหาที่สองแล้วใช้ปลั๊กอินwordpress.org/extend/plugins/post-types-orderจนกระทั่ง 3.1 ได้รับการเผยแพร่ :)
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.