ปัญหา
สิ่งที่คุณกำลังประสบปัญหาคือ "ฉันจะทำ X ได้อย่างไร" นี่ไม่ใช่การดำเนินการ 1 ขั้นตอน แต่เป็นกระบวนการหลายขั้นตอนและจำเป็นต้องแยกจากกัน
คุณไม่จำเป็นต้องทำสิ่งนี้:
get all the posts that are a child of X ordered by meta
คุณต้องทำสิ่งนี้:
get all the posts that are a child of X
for each child, get all the posts that are a child
foreach child of that child get all the posts that are a child
...
hmmm we don't have any more children left
Take our list of posts and order them by meta
การแก้ปัญหาทั่วไป
ดังนั้นเพื่อที่จะเข้าใจวิธีการที่จะทำอย่างไม่มีที่สิ้นสุดจนกว่าคุณจะถึงจุดสิ้นสุดโดยไม่ต้องเข้ารหัสมันคุณต้องเข้าใจฟังก์ชั่นวนซ้ำ
เช่น
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
การใช้การเรียกซ้ำไปยังปัญหานี้เพื่อการแก้ไข
ดังนั้นพ่อแม่ของคุณและเมตาโพสต์ของคุณมีสำคัญของ$parid
$metakey
ให้มันผ่านเข้าไปในฟังก์ชั่นเพื่อจับลูกของมัน
$children = get_children_with_meta( $parid, $metakey );
จากนั้นเราจะจัดเรียงแถว $ children คีย์จะเป็นรหัสโพสต์และค่าจะเป็นค่าเมตา
asort($children);
และให้นิยามฟังก์ชันเป็น:
function get_children_with_meta( $parent_id, $metakey ) {
$q = new WP_Query( array( 'post_parent' => $parent_id, 'meta_key' => $metakey ));
if ( $q->have_posts() ) {
$children - array();
while ( $q->have_posts() ) {
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
}
return $children;
} else {
// there are no children!!
return array();
}
}
สิ่งนี้จะช่วยให้คุณได้รับรหัสโพสต์และค่าต่างๆเรียงตามลำดับจากต่ำไปมาก คุณสามารถใช้ฟังก์ชั่นการจัดเรียง PHP อื่น ๆ เพื่อทำจากมากไปน้อย
ตอนนี้สิ่งที่เกี่ยวกับเด็กเด็ก
ในระหว่างการวนรอบเราจำเป็นต้องทำการเรียกซ้ำเรียกผ่านเด็กมากกว่า ID หลัก
ดังนั้นนี่คือ:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
กลายเป็นสิ่งนี้:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
// now get the childrens children
$grandchildren = get_children_with_meta( get_the_ID(), $metakey );
// merge the grandchildren and the children into the same list
$children = array_merge( $children, $grandchildren );
ด้วยการปรับเปลี่ยนนี้ฟังก์ชั่นตอนนี้ดึงเด็กเด็กเด็กเด็กเด็กเด็ก ..... ฯลฯ
ในตอนท้ายคุณสามารถตัดค่าในอาร์เรย์เพื่อรับ ID ดังนี้:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
การใช้กลยุทธ์นี้คุณสามารถแทนที่ค่าคีย์เมตาด้วยเมทริกอื่น ๆ หรือใช้ฟังก์ชันแบบเรียกซ้ำในวิธีอื่น
เนื่องจากรหัสเต็มต้องการเพียงไม่กี่วินาทีของความเข้าใจพื้นฐานและการคัดลอกอย่างรวดเร็วฉันจึงไม่ดูถูกสติปัญญาของคุณด้วยการวางบล็อคการคัดลอกแบบเต็มของรหัส
ข้อดี
- ด้วยการปรับเปลี่ยนการทำงานสำหรับประเภทโพสต์และรูปแบบของข้อมูลใด ๆ
- สามารถแก้ไขเพื่อสร้างมาร์กอัปที่ซ้อนกัน
- แคชเพื่อเพิ่มความเร็วได้อย่างง่ายดายโดยใส่อาร์เรย์ที่ส่งคืนใน transients
- สามารถตั้งค่าด้วยการสลับหน้าโดยใช้การเลื่อนหน้าไปยังจุดสิ้นสุด WP_Query
ปัญหาที่คุณจะพบ
- คุณไม่มีทางรู้ได้เลยว่ามีเด็กกี่คนจนกว่าคุณจะพบพวกเขาดังนั้นค่าใช้จ่ายในการปฏิบัติจึงไม่ลดลง
- สิ่งที่คุณต้องการจะสร้างข้อความค้นหาจำนวนมากและมีค่าใช้จ่ายสูงเนื่องจากความลึกที่อาจเกิดขึ้นที่เกี่ยวข้อง
คำแนะนำของฉัน
ฉันอยากจะแนะนำให้คุณทำให้ลำดับชั้นของหน้าแบนหรือใช้ taxonomy แทน เช่นหากคุณโพสต์การให้คะแนนมีการจัดอันดับหน้าภาษีด้วยเงื่อนไข 1,2,3,4 และ 5 เป็นต้นซึ่งจะช่วยให้คุณมีรายชื่อโพสต์ออกจากกล่อง
หรือใช้เมนูการนำทางและหลีกเลี่ยงปัญหานี้โดยสิ้นเชิง