การใช้ meta_query ฉันจะกรองตามฟิลด์ที่กำหนดเองและสั่งซื้อจากฟิลด์อื่นได้อย่างไร


10

ด้วยรหัสต่อไปนี้ (ใน function.php) โพสต์ของฉัน (จากเหตุการณ์ CPT) ถูกจัดเรียงโดย _end_date แทน _start_date อะไรคือทางออกที่ถูกต้องสำหรับ WP 3.1.3? meta_keyแน่นอนผมต้องการที่จะหลีกเลี่ยงการใช้เลิกใช้

add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( 'post_type', 'event' );
  $query->set( 'meta_key', '_start_date' );
  $query->set( 'orderby', 'meta_value_num' );
  $query->set( 'order', 'ASC' );
  $query->set( 'meta_query', array(
                                   array(
                                         'key' => '_end_date',
                                         'value' => time(),
                                         'compare' => '>=',
                                         'type' => 'numeric'
                                        )
                                   )
                              );
  }
  return $query;
}

คำตอบ:


15

นี่น่าจะเป็นจุดบกพร่องใน Wordpress Wordpress แก้ไข meta_query จริง ๆ ถ้าคุณระบุ orderby และ meta_key เป็น vars แบบสอบถาม โดยปกติการปรับเปลี่ยนนี้จะเพิ่ม meta_key ใหม่เป็นอาร์เรย์แรกในอาร์เรย์ meta_query และด้วยเหตุนี้ orderby จะถูกนำไปใช้กับเมตาคีย์แรกที่ระบุใน meta_query

แต่เมื่อคุณปรับเปลี่ยน orderby, meta_key และ meta_value query_vars ในตัวกรอง pre_get_posts เนื่องจากข้อผิดพลาด (ดูเหมือนว่าฉัน) ใน Wordpress จะเพิ่มอาร์เรย์ใหม่ในแบบสอบถาม meta ที่มีอยู่ แต่อาร์เรย์ใหม่จะไม่ถูกแทรกเป็นอาร์เรย์แรก ไปยัง meta_query ที่มีอยู่ และ orderby จะถูกนำไปใช้กับ meta_key แรกใน meta_query เสมอ

เพื่อเป็นการแก้ปัญหาจนกว่าข้อผิดพลาดจะได้รับการแก้ไขคุณสามารถระบุ meta_key อีกครั้งใน meta_query เป็นอาร์เรย์แรกเช่นในตัวอย่างต่อไปนี้:

add_filter( 'pre_get_posts', 'my_get_posts' );
function my_get_posts( $query ) {
if ( is_home() ) {
  $query->set( 'post_type', 'event' );
  $query->set( 'meta_key', '_start_date' );
  $query->set( 'orderby', 'meta_value_num' );
  $query->set( 'order', 'ASC' );
  $query->set( 'meta_query', array(
        array(
              'key' => '_start_date'
        ),
        array(
              'key' => '_end_date',
              'value' => time(),
              'compare' => '>=',
              'type' => 'numeric'
        )
  ));
  }
  return $query;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.