ใช้ Orderby และ meta_value_num เพื่อสั่งหมายเลขก่อนจากนั้นสตริง


16

ฉันมีรายการผลิตภัณฑ์แต่ละรายการที่มีราคาในฟิลด์ที่กำหนดเองซึ่งจัดเก็บเป็นข้อความเช่น "2.50" หรือ "5.00" และฉันกำลังแสดงรายการเหล่านั้นบนหน้าเว็บด้วยแบบสอบถามที่กำหนดเองซึ่งเรียงลำดับตามราคา:

    if(!$wp_query) {
        global $wp_query;
    }

    $args = array(
        'meta_key' => 'price',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );

    query_posts( array_merge( $args , $wp_query->query ) );

สิ่งนี้ใช้ได้ดีสำหรับราคา แต่บางราคาเป็น "POA" และฉันต้องการให้แสดงครั้งสุดท้ายอย่างไรก็ตามคำสั่งซื้อด้านบนในลักษณะที่ "POA" แสดงก่อน

มีวิธีใดบ้างที่จะแก้ไขสิ่งนี้หรือแฮ็คด่วนที่ฉันสามารถใช้เพื่อเรียงลำดับอาร์เรย์หลังจากนั้นและใส่ราคา "POA" ใด ๆ ในที่สุด?


ลองเปลี่ยน'orderby' => 'meta_value_num', เป็น'orderby' => 'meta_value_num meta_value',
Bainternet

ขอบคุณ แต่นั่นใช้ไม่ได้ :(
Shaun

Aha! แต่วิธีอื่น ๆ ก็ใช้งานได้meta_value meta_value_num! ขอบคุณ! คุณต้องการเขียนคำตอบเพื่อที่ฉันจะสามารถโหวตได้หรือไม่?
Shaun

1
โพสต์เป็นคำตอบสำหรับผู้ที่ไม่ได้อ่านความคิดเห็น
Bainternet

POA หมายถึง "ราคาสำหรับการถาม" en.wikipedia.org/wiki/Price_on_application
sudip

คำตอบ:


23

OrderByอาร์กิวเมนต์สามารถใช้เวลามากขึ้นแล้วหนึ่งพารามิเตอร์เพื่อให้การแก้ปัญหาคือการเปลี่ยนแปลง:

'orderby' => 'meta_value_num',

ถึง:

'orderby' => 'meta_value meta_value_num',

3
นี่เป็นเพียงการเรียงลำดับตัวอักษรตามลำดับเนื่องจากพารามิเตอร์ตัวที่สองเป็นแบบไม่มีการเรียงลำดับบนฟิลด์เดียวกันไม่มีผล ในการทำเช่นนี้เพื่อให้ตัวเลขเรียงลำดับตัวเลขและตัวอักษรคุณต้องใช้ตัวกรองเพื่อปรับแต่ง orderby ให้ใช้ตัวเรียง SQL บางประเภทเช่นORDER BY CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC
bonger

@bonger ขอบคุณ! โซลูชันของคุณเป็นโซลูชันที่สมบูรณ์สำหรับปัญหานี้ และนี่คือรหัสที่เหลือสำหรับการสืบค้นของคุณ ฉันจะโพสต์มันเป็นคำตอบสำหรับผู้เข้าชมใหม่
Gangesh

2

ฉันพบโซลูชันนี้โดยการรวมรหัสโดย @bonger และ/programming/18084199/wordpress-query-order-by-case-when

และมันใช้งานได้ดี

ฟังก์ชัน

function filter_case($orderby = '') {
  $orderby .= "CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC";
  return $orderby;
}

ก่อนทำการค้นหา

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

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