Vấn đề
Điều bạn đang gặp vấn đề là "Làm thế nào để tôi làm X?" Đây không phải là một hành động 1 bước, nó là một quá trình nhiều bước và nó cần phải được phá vỡ.
Bạn không cần phải làm điều này:
get all the posts that are a child of X ordered by meta
Bạn cần phải làm điều này:
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
Giải pháp chung
Vì vậy, để hiểu làm thế nào để thực hiện nó vô tận cho đến khi bạn đạt đến cuối cùng, mà không cần mã hóa nó, bạn cần hiểu các hàm đệ quy.
ví dụ
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
Áp dụng đệ quy cho vấn đề này cho một giải pháp
Vì vậy, cha mẹ của bạn là $parid
, và meta bài đăng của bạn có một chìa khóa $metakey
.
Cho phép vượt qua nó vào một chức năng để lấy con của nó.
$children = get_children_with_meta( $parid, $metakey );
Sau đó, chúng tôi sẽ sắp xếp mảng $ children, các khóa sẽ là ID bài đăng và các giá trị sẽ là các giá trị meta.
asort($children);
và cho phép định nghĩa hàm là:
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();
}
}
Điều này cung cấp cho bạn một loạt các ID và giá trị bài đăng, được sắp xếp từ thấp nhất đến cao nhất. Bạn có thể sử dụng các hàm sắp xếp PHP khác để thực hiện nó từ cao nhất đến thấp nhất.
Bây giờ còn trẻ em thì sao?
Ở giữa vòng lặp của chúng tôi, chúng tôi cần thực hiện một cuộc gọi đệ quy, truyền vào con chứ không phải ID cha.
Vậy đây:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
Trở thành này:
$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 );
Với sửa đổi này, chức năng bây giờ lấy ra trẻ em, trẻ em trẻ em, trẻ em trẻ em trẻ em ..... vv
Cuối cùng, bạn có thể cắt bớt các giá trị trên mảng để lấy ID như thế này:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
Sử dụng chiến lược này, bạn có thể thay thế giá trị khóa meta bằng bất kỳ số liệu nào khác hoặc sử dụng các hàm đệ quy theo các cách khác.
Vì mã đầy đủ chỉ cần một vài giây để hiểu cơ bản và dán sao chép nhanh, tôi sẽ không xúc phạm trí thông minh của bạn bằng một khối mã sao chép đầy đủ.
Ưu điểm
- Với sửa đổi hoạt động cho bất kỳ loại bài và hình thức dữ liệu
- Có thể được sửa đổi để tạo đánh dấu lồng nhau
- Dễ dàng lưu trữ để tăng tốc bằng cách đặt các mảng được trả về trong quá độ
- Có thể được thiết lập với phân trang bằng cách áp dụng phân trang cho cuối WP_Query
Những vấn đề bạn sẽ gặp phải
- Bạn không có cách nào để biết có bao nhiêu trẻ em cho đến khi bạn tìm thấy chúng, vì vậy chi phí hiệu suất không quy mô
- Những gì bạn muốn sẽ tạo ra rất nhiều truy vấn, và vốn đã rất tốn kém vì độ sâu tiềm năng có liên quan.
Đề nghị của tôi
Tôi sẽ khuyên bạn nên làm phẳng hệ thống phân cấp trang của bạn hoặc sử dụng phân loại thay thế. Ví dụ: nếu bạn xếp hạng bài đăng, hãy phân loại Xếp hạng Trang với các điều khoản 1,2,3,4 và 5, v.v ... Điều này sẽ cung cấp cho bạn một danh sách bài đăng ngoài hộp.
Ngoài ra, sử dụng menu nav và bỏ qua vấn đề này hoàn toàn