Sorun
Kavramakta sorun yaşadığınız şey "X'i nasıl yaparım?" Bu 1 adımlık bir eylem değil, çok aşamalı bir süreçtir ve parçalanması gerekir.
Bunu yapmanız gerekmez:
get all the posts that are a child of X ordered by meta
Bunu yapmanız gerekir:
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
Genel Çözüm
Bu nedenle, sonuna kadar, kodlamadan sonsuz şekilde nasıl yapacağınızı anlamak için, yinelemeli işlevleri anlamanız gerekir.
Örneğin
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
Çözüm için Bu Soruna Özyineleme Uygulama
Böylece ebeveyniniz $parid
ve meta meta anahtarınız var $metakey
.
Çocuklarını yakalama işlevine geçelim.
$children = get_children_with_meta( $parid, $metakey );
Sonra $ children dizisini sıralayacağız, anahtarlar posta kimlikleri ve değerler meta değerler olacak.
asort($children);
ve işlevi şöyle tanımlayalım:
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();
}
}
Bu size en düşükten en yükseğe doğru sıralanmış bir dizi posta kimliği ve değeri verir. En yüksekten en düşüğe doğru yapmak için diğer PHP sıralama işlevlerini kullanabilirsiniz.
Peki Ya Çocuk Çocukları?
Döngünümüzün ortasında, ebeveyn kimliği yerine alt öğeyi geçerek yinelemeli bir çağrı yapmamız gerekiyor.
Yani bu:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
Bu olur:
$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 );
Bu modifikasyon ile fonksiyon şimdi çocukları, çocuk çocuklarını, çocuk çocuk çocuklarını alır ..... vb.
Sonunda, aşağıdaki gibi kimlikler almak için dizideki değerleri kesebilirsiniz:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
Bu stratejiyi kullanarak meta anahtar değerini başka bir metrikle değiştirebilir veya özyinelemeli işlevleri başka şekillerde kullanabilirsiniz.
Tam kod sadece birkaç saniye temel anlama ve hızlı kopyala yapıştırma gerektirdiğinden, tam kopyala yapıştırma kod bloğuyla zekanıza hakaret etmem.
Avantajları
- Herhangi bir yazı tipi ve veri formu için değişiklik çalışmaları ile
- İç içe işaretleme oluşturmak için değiştirilebilir
- Döndürülen dizileri geçici olarak yerleştirerek hızlandırmak için kolayca önbellekleyin
- WP_Query sonuna sayfalama uygulanarak sayfalama ile ayarlanabilir
Karşılaşacağınız Sorunlar
- Onları bulana kadar kaç çocuğun olduğunu bilmenin hiçbir yolu yoktur, bu nedenle performans maliyetleri ölçeklendirilmez
- İstediğiniz çok fazla sorgu oluşturacak ve içerdiği potansiyel derinlikler nedeniyle doğası gereği maliyetli olacaktır.
Benim önerim
Sayfa hiyerarşinizi düzleştirmenizi veya bunun yerine bir sınıflandırma kullanmanızı öneririm. Örneğin, yayınları derecelendiriyorsanız, 1,2,3,4 ve 5 vb. Terimler içeren bir Sayfa Derecelendirmesi sınıflandırmasına sahip olursunuz.
Alternatif olarak, gezinme menülerini kullanın ve bu sorunu tamamen atlayın