Masalah
Apa yang Anda punyai kesulitan untuk memahami adalah "Bagaimana saya melakukan X?" Ini bukan tindakan 1 langkah, ini adalah proses multi-langkah, dan perlu dipisah-pisahkan.
Anda tidak perlu melakukan ini:
get all the posts that are a child of X ordered by meta
Anda perlu melakukan ini:
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
Solusi Umum
Jadi, untuk memahami cara melakukannya hingga Anda mencapai akhir, tanpa hardcoding, Anda perlu memahami fungsi rekursif.
misalnya
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
Menerapkan Rekursi Untuk Masalah Ini Sebagai Solusi
Jadi orang tua Anda $parid
, dan meta pos Anda memiliki kunci $metakey
.
Mari kita berikan fungsi untuk mengambil anak-anaknya.
$children = get_children_with_meta( $parid, $metakey );
Kemudian kita akan mengurutkan array $ children, kunci akan menjadi ID posting, dan nilainya akan menjadi nilai meta.
asort($children);
dan mari kita mendefinisikan fungsi sebagai:
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();
}
}
Ini memberi Anda array ID dan nilai pos, dipesan dari terendah ke tertinggi. Anda dapat menggunakan fungsi penyortiran PHP lainnya untuk melakukannya dari tertinggi ke terendah.
Sekarang Bagaimana Dengan Anak-Anak?
Di tengah-tengah loop kita, kita perlu membuat panggilan rekursif, melewati anak daripada ID induk.
Jadi ini:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
Menjadi ini:
$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 );
Dengan modifikasi ini fungsi sekarang mengambil anak-anak, anak-anak anak-anak, anak-anak anak-anak ..... dll
Pada akhirnya Anda dapat memotong nilai pada array untuk mendapatkan ID seperti ini:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
Dengan menggunakan strategi ini, Anda dapat mengganti nilai kunci meta dengan metrik lainnya, atau menggunakan fungsi rekursif dengan cara lain.
Karena kode lengkap hanya memerlukan beberapa detik pemahaman dasar dan copy paste cepat, saya tidak akan menghina kecerdasan Anda dengan blok kode copy paste penuh kode.
Keuntungan
- Dengan modifikasi berfungsi untuk semua jenis posting dan bentuk data
- Dapat dimodifikasi untuk menghasilkan markup bersarang
- Mudah cache untuk mempercepat dengan menempatkan array yang dikembalikan dalam transien
- Dapat diseting dengan paging dengan menerapkan paging pada bagian akhir WP_Query
Masalah yang Akan Anda Temui
- Anda tidak memiliki cara untuk mengetahui berapa banyak anak-anak di sana sampai Anda menemukannya, sehingga biaya kinerja tidak bertambah
- Apa yang Anda inginkan akan menghasilkan banyak pertanyaan, dan secara inheren mahal karena kedalaman potensial yang terlibat.
Rekomendasi saya
Saya akan merekomendasikan Anda untuk meratakan hierarki halaman Anda atau menggunakan taksonomi sebagai gantinya. Misalnya, jika Anda memberi peringkat pada posting, miliki taksonomi Peringkat Halaman dengan ketentuan 1,2,3,4 dan 5, dll. Ini akan memberi Anda daftar posting di luar kotak.
Atau, gunakan menu nav dan bypass masalah ini sepenuhnya