समस्या
आपको जो समस्याएँ हो रही हैं, वह है "मैं एक्स कैसे करूँ?" यह एक 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 );
फिर हम $ बच्चों की सरणी को सॉर्ट करेंगे, कुंजियाँ पोस्ट आईडी होंगी, और मान मेटा मान होंगे।
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 छँटाई कार्यों का उपयोग कर सकते हैं।
अब बाल बच्चों के बारे में क्या?
हमारे लूप के बीच में, हमें एक पुनरावर्ती कॉल करने की आवश्यकता है, माता-पिता की आईडी के बजाय बच्चे में पास करना।
तो यह:
$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 );
इस संशोधन के साथ समारोह अब बच्चों को, बच्चों के बच्चों को, बच्चों के बच्चों को ..... आदि को पुनः प्राप्त करता है
अंत में आप इस तरह से आईडी प्राप्त करने के लिए सरणी पर मानों को ट्रिम कर सकते हैं:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
इस रणनीति का उपयोग करके आप मेटा कुंजी मान को किसी अन्य मीट्रिक के साथ बदल सकते हैं, या अन्य तरीकों से पुनरावर्ती कार्यों का उपयोग कर सकते हैं।
चूँकि पूर्ण कोड के लिए केवल कुछ सेकंड की बुनियादी समझ और त्वरित कॉपी पेस्ट की आवश्यकता होती है, इसलिए मैं कोड के पूर्ण कॉपी पेस्ट ब्लॉक के साथ आपकी बुद्धिमत्ता का अपमान नहीं करूँगा।
लाभ
- किसी भी प्रकार के पोस्ट और डेटा के रूप में संशोधन के साथ काम करता है
- नेस्टेड मार्कअप उत्पन्न करने के लिए संशोधित किया जा सकता है
- आसानी से कैशे लौटाएं ताकि ट्रांजेक्शंस में लौटे एरियर्स को डाल सकें
- पेजिंग को अंतिम WP_Query पर लागू करके पेजिंग के साथ सेटअप किया जा सकता है
समस्याओं का आप सामना करेंगे
- आपके पास यह जानने का कोई तरीका नहीं है कि जब तक आप उन्हें नहीं ढूंढते हैं, तब तक कितने बच्चे हैं, इसलिए प्रदर्शन लागतों का कोई पैमाना नहीं है
- आप जो चाहते हैं वह बहुत सारे प्रश्न उत्पन्न करेगा, और संभावित गहराईयों के कारण स्वाभाविक रूप से महंगा है।
मेरी सिफारिश
मैं आपको अपने पृष्ठ पदानुक्रम को या तो समतल करने या इसके बजाय एक वर्गीकरण का उपयोग करने की सलाह दूंगा। उदाहरण के लिए, यदि आप रेटिंग पोस्ट कर रहे हैं, तो 1,2,3,4 और 5 आदि शर्तों के साथ एक पेज रेटिंग टैक्सोनॉमी है। यह आपको बॉक्स से बाहर की सूची के साथ प्रदान करेगा।
वैकल्पिक रूप से, नौसेना मेनू का उपयोग करें और इस समस्या को पूरी तरह से बायपास करें