ฉันแก้ไขการค้นหา WP ในตัวโดยใช้pre_get_posts
ตัวกรองทำให้ผู้ใช้สามารถเรียงลำดับโพสต์ (รวมถึงโพสต์ที่กำหนดเองจำนวนมาก) ตามเขตข้อมูลที่แตกต่างกัน
ปัญหาที่ฉันมีอยู่ก็คือเมื่อฉันบอกให้ WP เรียงลำดับตามค่าเมตามันจะยกเว้นการโพสต์ทั้งหมดที่ไม่ได้ตั้งค่าเมตานั้น สิ่งนี้ทำให้จำนวนผลลัพธ์เปลี่ยนไปถ้าคุณเปลี่ยนการเรียงลำดับจากพูดว่า "ราคา" เป็น "วันที่" เนื่องจาก "โพสต์" ไม่มีการตั้งค่า "ราคา" แต่ทำ "รายการ"
นี่ไม่ใช่สิ่งที่ฉันต้องการดังนั้นฉันจึงอยากทราบว่ามีวิธีการรวมโพสต์ทั้งหมดหรือไม่แม้ว่าจะมีเมตาดาต้าที่ฉันเรียงลำดับอยู่หรือไม่ก็ตาม
ฉันรู้วิธีเรียงลำดับมากกว่าหนึ่งฟิลด์ แต่นั่นไม่ได้ช่วย
ขอบคุณ
ดูเหมือนว่าฉันไม่ใช่คนเดียวที่มีคำถามนี้: วิธีรวมโพสต์ทั้งที่มี & ไม่มี meta_key บางรายการใน args สำหรับ wp_query หรือไม่ แต่ก็ไม่มีทางออก
ปรับปรุง
ฉันลองคำตอบแล้ว แต่ไม่แน่ใจว่าฉันเข้าใจถูกต้องหรือไม่นี่คือสิ่งที่ฉันมีตอนนี้:
<?php
function my_stuff ($qry) {
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');
}
ค่าเมตาคือตัวเลข (ใช้เพื่อเก็บราคาตามชื่อที่แนะนำ)
อัปเดต 2
ฉันได้แสดงความคิดเห็นเกี่ยวกับการสั่งซื้อและตอนนี้ที่ฉันมีคือ:
<?php
$qry->set('meta_query', array(array(
'key' => 'item_price',
'value' => '',
'compare' => 'NOT EXISTS'
)));
ด้วยรหัสนี้ดูเหมือนว่าแบบสอบถามจะส่งคืนโพสต์ทั้งหมดที่ไม่มีitem_price
คีย์และไม่มีโพสต์ที่มีอยู่ IE ปัญหากลับตอนนี้
ถ้าฉันเพิ่มในรหัสการสั่งซื้อเช่นกันฉันจะได้รับผลลัพธ์ 0
แก้ไข: ... สามปีต่อมา ... : PI มีปัญหานี้อีกครั้ง ฉันลองคำตอบทั้งหมดที่ได้รับ แต่ก็ไม่ทำงาน ไม่แน่ใจว่าทำไมบางคนถึงคิดว่าพวกเขาทำงาน แต่พวกเขาไม่ได้ทำงานให้ฉันอย่างน้อย
วิธีแก้ปัญหาที่ฉันใช้คือการใช้save_post
ตัวกรองทำให้แน่ใจว่าโพสต์ทั้งหมดมีฟิลด์ที่กำหนดเองที่ฉันต้องการเรียงลำดับ มันน่ารำคาญนิดหน่อยที่ฉันต้องทำ แต่ตราบใดที่คุณทำตั้งแต่เนิ่น ๆ คุณอาจจะไม่มีปัญหา
ในกรณีนี้ฉันกำลังสร้าง "มุมมองตัวนับ" บนโพสต์และต้องการให้ผู้ใช้สามารถเรียงลำดับในโพสต์ที่อ่านมากที่สุด อีกครั้งโพสต์ที่ไม่เคยดู (ฉันเดาว่ามันไม่น่าจะสวย - แต่ยังคง) หายไปเมื่อเรียงลำดับตามจำนวนการดู ฉันเพิ่มรหัสบิตนี้เพื่อให้แน่ใจว่าโพสต์ทั้งหมดมีจำนวนการดู:
add_action('save_post', function ($postId) {
add_post_meta($postId, '_sleek_view_count', 0, true);
});
meta_query
และtax_query
มีเสมอarray( array() )
ที่พวกเขารวมอาร์เรย์หลาย ประการที่สอง - ตามที่ระบุไว้ในคำตอบของฉัน - คุณต้องใช้meta_value_num
สำหรับตัวเลข มันอาจจำเป็นต้องกำหนดจริง ๆmeta_value_num
(ดูWP_Query
รายการหน้า -Codex) ที่ผ่านมาก็ไม่ได้ทำให้ความรู้สึกที่จะorder
อยู่ในASC
และ DESC
ทิศทาง มันเป็นไปไม่ได้. คั่นพื้นที่ทำงานเฉพาะสำหรับorderby
และคุณไม่สามารถบอกได้ว่ามันจะเรียงลำดับแรกและครั้งที่สองASC
DESC
นั่นคือสิ่งที่posts_clauses
ตัวกรองมีไว้เพื่อ
meta_value_num
รายการของคุณเป็นตัวเลขจริง เห็นบ่อยเกินไปว่ามีคนระบุว่าเป็นตัวเลข แต่ในความเป็นจริงการบันทึกเป็นสตริงในฐานข้อมูล
ASC DESC
ก็คือเพื่อให้มันเรียงลำดับmeta_value
ในASC
และdate
ในDESC
เท่าที่ฉันสามารถบอกได้ว่ามันทำงาน