ผมมีโปรเจ็คอยู่ตัวหนึ่งครับ ที่มีเงื่อนไขในการจัดเรียงสินค้าที่พิเศษกว่าเว็บขายของทั่วไป นั่นก็คือมีการต้องการจัดเรียงสินค้าแบบเรียงตามรุ่น และเรียงตามราคาแพงสุด นั่นก็คือรุ่นใหม่สุดแพงสุดต้องมาก่อนเป็นอันดับแรก ซึ่งความต้องการแบบนี้ แน่นอนว่า WooCommerce แบบ Default ยังไม่มีมาให้แน่ๆ ก็เป็นหน้าที่ของโปรแกรมเมอร์อย่างเราๆ ที่ต้องมารับมือต่อใช่ไหมครับ
ก่อนอื่นนั้น สำหรับเคสนี้ผมทำการสร้าง Custom Field สำหรับสินค้าแต่ละตัวขึ้นมาก่อนครับ เพื่อเอาไว้ให้ลูกค้าใส่ รุ่นปีของสินค้าตัวนั้น โดยตั้งชื่อฟิลด์ว่า year ครับผม . ส่วนตัวราคาก็เป็น meta key ของ WooCommerce อยู่แล้ว ชื่อว่า _price ครับ
หน้าที่ของเราก็คือ ต้องเอาเจ้าสองตัวนี้มาเป็นเงื่อนไขในการเช็คค่าและเอามาแสดงผล เราเรียกว่า Multi meta key ครับ
วิธีการทำตัวเช็คเงื่อนไข ให้เรานำโค้ดนี้ไปเขียนในไฟล์ functions.php ของธีมเรานะครับ
add_action( 'woocommerce_product_query', 'multi_meta_product_query' ); function multi_meta_product_query( $q ){ $meta_query = $q->get( 'meta_query' ); $meta_query[] = array( 'relation' => 'AND', "have_year" => array( 'key' => 'year', 'type' => 'numeric' , 'compare' => 'EXISTS' ), "_price" => array( 'key' => '_price', 'type' => 'numeric' , 'compare' => 'EXISTS' ), ); $q->set( 'meta_query', $meta_query ); $orderby = array( 'have_year' => 'DESC', '_price' => 'DESC', ); $q->set( 'orderby', $orderby ); }
เอาหละ เดี๋ยวผมขออธิบายโค้ดตัวนี้ก่อนนะครับ เราจะเห็นว่าตรงที่เป็น meta_query เราใส่เงื่อนไปขไปแล้วสองแบบ นั่นก็คือ
$meta_query[] = array( 'relation' => 'AND', "have_year" => array( 'key' => 'year', 'type' => 'numeric' , 'compare' => 'EXISTS' ), "_price" => array( 'key' => '_price', 'type' => 'numeric' , 'compare' => 'EXISTS' ), );
ถ้าเรามีเงื่อนไขมากกว่านี้ก็ใส่ไปให้ครบครับ จากนั้นก็มาเริ่มทำการให้มันจัดเรียงลำดับครับ ซึ่งก็คือตรงนี้
$orderby = array( 'have_year' => 'DESC', '_price' => 'DESC', );
โดยโค้ดด้านบน ผมให้เรียงแบบมากสุดไปน้อยสุดครับ ถ้าเราต้องการรูปแบบอื่นก็แก้ไขได้จาก DESC เป็น ASC อะไรแบบนี้ก็ได้แล้วแต่ที่เราปรารถนาครับ
สำหรับใครที่กำลังทำโปรเจ็ค WooCommerce แล้วมีความต้องการแนวๆนี้ก็ลองนำโค้ดไปปรับแต่งใช้งานดูได้นะครับ หวังว่าจะเป็นประโยชน์ให้กับทุกท่านได้ครับ แล้วเจอกันใหม่เด้อ