แบบสอบถามที่กำหนดเองที่มี orderby meta_value ของเขตข้อมูลที่กำหนดเอง


36

คุณรู้หรือไม่ตั้งแต่ WP3.0 มีตัวเลือกสำหรับการสืบค้นขั้นสูงที่กำหนดเองซึ่งยอดเยี่ยม ด้วยเหตุนี้พารามิเตอร์การสืบค้นบางส่วนของฟิลด์ที่กำหนดเองเช่น meta_key, meta_value จึงถูกคัดค้านสำหรับพารามิเตอร์ meta_query ใหม่ ( ดูที่นี่ )

ฉันพยายามที่จะมีแบบสอบถามที่ค่อนข้างง่ายด้วยไวยากรณ์ใหม่โพสต์แบบสอบถามโดยบาง post_type (บริการ) ที่มี meta_key ที่ระบุ (order_in_archive) ที่ระบุ - นี่เป็นไปตามที่คาดไว้ แต่ - ฉันต้องการสั่งซื้อโดยแบบสอบถามโดย meta_value และไม่ประสบความสำเร็จ

นี่คือแบบสอบถามของฉัน -

   query_posts(
    array(  'post_type' => 'services',
        'order' => 'ASC',
        'orderby' => 'meta_value',
        'meta_query' => array(
            array('key' => 'order_in_archive'))
    )
);

ฉันพยายาม orderby โดย meta_value_numeric และ meta_value แต่ไม่ว่าในกรณีใดผลลัพธ์จะถูกจัดเรียงตามวันที่เผยแพร่ (ตามโพสต์ปกติ) ใครรู้วิธีนี้สามารถทำได้?

ขอบคุณ

คำตอบ:


35

คุณสามารถกำหนดเมตาคีย์สำหรับพารามิเตอร์orderbyโดยใช้วิธีเก่า (ฉันทดสอบบน WP 3.1.1) ...

query_posts(
    array(  'post_type' => 'services',
            'order'     => 'ASC',
            'meta_key' => 'some_key',
            'orderby'   => 'meta_value', //or 'meta_value_num'
            'meta_query' => array(
                                array('key' => 'order_in_archive',
                                      'value' => 'some_value'
                                )
                            )
    )
);

15

โดยทั่วไปปัญหานี้จะถูกล้างใน WordPress 4.2โดยใช้การสืบค้นที่มีชื่อ เช่น

$args = array(
  'post_type' => 'services',
  'orderby'   => 'order_clause',
  'meta_query' => array(
       'order_clause' => array(
            'key' => 'order_in_archive',
            'value' => 'some_value',
            'type' => 'NUMERIC' // unless the field is not a number
)));

สำหรับฉันฉันต้องการสั่งซื้อโดยฟิลด์ตัวเลขและฉันต้องใช้'type' => 'NUMERIC'ภายในแบบสอบถามเมตาดาต้า


1
ค้นหาที่ยอดเยี่ยมสำหรับข้อความค้นหาที่ตั้งชื่อ!
Kaji

ใช่เคียวรีที่ตั้งชื่อตอบคำถามของฉันด้วย
Dalton

ยอดเยี่ยม ฉันไม่แน่ใจความสำคัญของ 'คุณค่า' ใน order_clause นั้นเพราะไม่จำเป็นเพราะจะสั่งโดยค่าสูงสุดถึงต่ำสุดของ 'order_in_archive'
Andrew Schultz

10

WP Codex สับสนจริง ๆ เมื่อแก้ไขปัญหานี้

คุณไม่จำเป็นต้องใช้ meta_query param เพื่อใช้ orderby แทน แต่จะใช้ meta_key param ซึ่งถึงแม้ว่าโดย WP Codex จะเลิกใช้แล้วได้ถูกสร้างขึ้นที่นี่: คุณใช้ orderby กับ meta_query ใน Wordpress 3.1 อย่างไร ลำดับที่ยังคงต้องการ meta_key

ดังนั้นมันควรจะเป็น

query_posts( array(
  'post_type' => 'services',
  'order' => 'ASC',
  'orderby' => 'meta_value',
  'meta_key' => 'order_in_archive'
) )

2
ใช่แล้วนี่เป็นวิธีการเก่าสำหรับการทำแบบสอบถามนี้และดูเหมือนจะใช้งานได้กับแบบสอบถามที่ระบุนี้ อย่างไรก็ตามสำหรับข้อความค้นหาที่ซับซ้อนมากขึ้นจะไม่สามารถใช้งานได้ ฉันพบว่านี่เป็นปัญหาที่ทราบแล้วว่ากำลังได้รับการดูแลรายละเอียดสามารถพบได้ในตั๋ว trac # 15031และ# 17065
Maor Barazany

2

มันเป็นเรื่องง่าย:

นี่คือรหัสของฉัน:

query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
) );

รายละเอียดหลักคือ: รวมถึงmeta_keyรหัสของฉันไม่ได้เรียงลำดับเว้นแต่meta_keyจะรวมอยู่และนั่นคือทั้งหมด:

นี่คือรหัสเต็มของรายการdirectorsรูปภาพเรียงตามdirector_weight:

<?php 
    query_posts(array( 
        'post_type' => 'directors',
        'posts_per_page' => -1,
        'order'    => 'ASC',
        'orderby'  => 'director_weight',
        'meta_key' => 'director_weight'
    ) );
    while (have_posts()) : the_post();
?>  
    <li <?php echo get_field('director_weight') ?>>
        <img src="<?php echo get_field('director_imagen') ?>">
    </li>
<?php
    endwhile;
    wp_reset_query();
?>

order_by wordpress ที่กำหนดเอง



0

ฉันพบว่าสิ่งนี้ทำงานได้ค่อนข้างดี

<?php 
query_posts(
array(  'posts_per_page' => '-1',
        'post_type' => 'services',
        'order'     => 'DESC',
        'meta_key' => '_order',
        'orderby'   => 'meta_value_num', //or 'meta_value_num'
      )
);

3
คำถามนี้เกี่ยวกับmeta_queryพารามิเตอร์ใหม่และได้รับการorderbyทำงานกับมันไม่ใช่เกี่ยวกับพารามิเตอร์meta_key/ การทำงานที่เก่ากว่า แต่ยังคงใช้งานmeta_valueได้ query_postsนอกจากนี้ยังให้ไม่แนะนำให้ใช้
s_ha_dum

คำตอบนี้มีแนวทางปฏิบัติที่ไม่ดีหลายประการ: การใช้ -1 ผ่านมันเป็นสตริงโดยใช้ query_posts มันควรจะถูกลบออก
Ihor Vorotnov

0

ฉันมีชุดวันที่จัดกิจกรรมที่กำหนดเองที่ฉันต้องการเพื่อจัดเรียงตามวันที่จากมากไปน้อย เนื่องจากวันที่จัดกิจกรรมที่กำหนดเองของฉันถูกเก็บไว้ในตาราง wp_postmeta ของฉันและโดยทั่วไปแล้วจะแตกต่างจากวันที่ post_date หรือที่แก้ไขดังนั้นจึงเหมาะกับฉัน:

  $args = array(
    'post_type' => 'events', // my post type - yours can be 'posts'
    'post_status' => 'publish', // only get posts with this status
    'orderby' => 'meta_value', // orderby the meta_value of the following meta_key
    'meta_key' => 'my_custom_eventdate', // the custom meta_key name
    'order'=> 'DESC' // sort descending
  );

  $posts = new WP_Query($args);

จากนั้นคุณสามารถวนซ้ำผ่านโพสต์ของ $ ดังนี้:

foreach($posts->posts as $p){

    $post_id = $p->ID;
    // and so on ...

    // # example of how I retrieve my event date
    $event = get_post_meta($post_id, 'my_custom_eventdate', true);
}

0

งานนี้สำหรับฉัน

    $args = array(
        'post_type' => 'services',
        'order' => 'ASC',
        'orderby'   => 'order_clause',   
        'meta_query' => array(
        'order_clause' => array(
        'key' => 'order_in_archive'
    )));

จำเป็นต้องระบุคีย์สำหรับ order_clause เท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.