Wp को wp क्वेरी का उपयोग करके माता-पिता के सभी उप पृष्ठ मिलते हैं


13

यहाँ मेरा कोड है

$my_wp_query = new WP_Query();
$all_wp_pages = $my_wp_query->query(array('post_type' => 'page','post_parent'=>$parid,'orderby'=>'title','order'=>'ASC' ));

यह पहले स्तर के उप पृष्ठों को ही प्रदर्शित करता है। मुझे सभी उप पृष्ठ, उप उप पृष्ठ ... और सभी की आवश्यकता है। मैंने एक समाधान खोजा और मुझे get_pages और wp_list_pages का उपयोग करके सभी उप पृष्ठ मिल सकते हैं।

लेकिन मुझे वास्तव में कस्टम पोस्ट मेटा मान द्वारा क्रम को क्रमबद्ध करने की आवश्यकता है। इसलिए मुझे कस्टम क्वेरी का उपयोग करना होगा।

कृपया मदद कीजिए। धन्यवाद


1
नीचे आप कहते हैं कि आपको एक उत्तर मिला, यह क्या है?
ड्रू बेकर

4
क्या आपने get_page_children की जाँच की है ?
t31os

जवाबों:


6

सिर्फ उपयोग क्यों नहीं get_pages()?

जैसे

<?php
// Determine parent page ID
$parent_page_id = ( '0' != $post->post_parent ? $post->post_parent : $post->ID );
// Get child pages as array
$page_tree_array = get_pages( array(
    'child_of' => $parent_page_id;
) );
?>

लेकिन अगर यह वास्तव में एक WP_Query()वस्तु के रूप में होना चाहिए , तो एक समान विधि का उपयोग करें:

<?php
// Determine parent page ID
$parent_page_id = ( '0' != $post->post_parent ? $post->post_parent : $post->ID );
// Build WP_Query() argument array
$page_tree_query_args = array(
    'post_parent' => $parent_page_id;
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
?>

अगर हम get_pages () कार्यक्षमता का उपयोग करते हैं तो हम कस्टम फ़ील्ड के लिए सॉर्टिंग (Sort_column) को लागू नहीं कर सकते। यह केवल पोस्ट टेबल फील्ड को ही स्वीकार करता है। मुझे कस्टम क्षेत्र के लिए छंटाई को लागू करने की आवश्यकता है। तो केवल मैं wp क्वेरी () का उपयोग करता हूं। क्या कोई वैकल्पिक तरीका है?
phpuser

क्या आपने मेरे उत्तर का दूसरा भाग देखा, जिसमें मैं उपयोग करता हूं WP_Query()?
चिप बेनेट 13

मैंने इस कोड की कोशिश की लेकिन यह पहले स्तर के उप पृष्ठों को ही लौटाता है। मुझे उप पृष्ठ >> उप उप >> आदि ... (पृष्ठों के कई निचले स्तर) की आवश्यकता है। अंत में मुझे समाधान मिल गया। आपके उत्तर के लिए धन्यवाद
phpuser

7
आपका समाधान क्या है !?
JCHASE11

वाक्य रचना त्रुटियों के कारण सरणी परिभाषाओं के अंदर कुछ अर्धविराम हैं।
पीटीरीन

4

समस्या

आपको जो समस्याएँ हो रही हैं, वह है "मैं एक्स कैसे करूँ?" यह एक 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 आदि शर्तों के साथ एक पेज रेटिंग टैक्सोनॉमी है। यह आपको बॉक्स से बाहर की सूची के साथ प्रदान करेगा।

वैकल्पिक रूप से, नौसेना मेनू का उपयोग करें और इस समस्या को पूरी तरह से बायपास करें


3

पुनरावर्ती सभी वर्तमान उप-पृष्ठ प्राप्त करें

यहाँ एक पुनरावर्ती दृष्टिकोण का उपयोग किया गया है get_children। निम्नलिखित को अपने में रखें functions.php:

function get_all_subpages($page, $args = '', $output = OBJECT) {
    // Validate 'page' parameter
    if (! is_numeric($page))
        $page = 0;

    // Set up args
    $default_args = array(
        'post_type' => 'page',
    );
    if (empty($args))
        $args = array();
    elseif (! is_array($args))
        if (is_string($args))
            parse_str($args, $args);
        else
            $args = array();
    $args = array_merge($default_args, $args);
    $args['post_parent'] = $page;

    // Validate 'output' parameter
    $valid_output = array(OBJECT, ARRAY_A, ARRAY_N);
    if (! in_array($output, $valid_output))
        $output = OBJECT;

    // Get children
    $subpages = array();
    $children = get_children($args, $output);
    foreach ($children as $child) {
        $subpages[] = $child;

        if (OBJECT === $output)
            $page = $child->ID;
        elseif (ARRAY_A === $output)
            $page = $child['ID'];
        else
            $page = $child[0];

        // Get subpages by recursion
        $subpages = array_merge($subpages, get_all_subpages($page, $args, $output));
    }

    return $subpages;
}

इसका इस्तेमाल कैसे करें

उदाहरण के लिए, जहाँ भी आप चाहें, उपरोक्त फ़ंक्शन का उपयोग करें:

$all_current_subpages = get_all_subpages(0);

फ़ंक्शन एक argsपैरामीटर (क्वेरी स्ट्रिंग या सरणी) और एक outputप्रकार (ऊपर देखें) का समर्थन करता है ।

तो आप भी इसे इस तरह से उपयोग कर सकते हैं:

$args = array(
    'post_status' => 'private',
    'order_by' => 'post_date',
    'order' => 'DESC',
);
$all_current_subpages = get_all_subpages(42, $args, ARRAY_A);

और निर्भरता के कारण get_children=> get_posts=> WP_Queryआप मेटा मूल्यों का उपयोग कर सकते हैं, जैसा कि शुरू में इस प्रश्न के लेखक द्वारा अनुरोध किया गया था।


2

निश्चित नहीं है कि यह ठीक वही है जो आप बाद में हैं, लेकिन आप wp_list_pages फ़ंक्शन का उपयोग कर सकते हैं, और 'child_of' और 'deep' मापदंडों का उपयोग कर सकते हैं।

अधिक जानकारी के लिए कोडेक्स पर निम्न पृष्ठ देखें: http://codex.wordpress.org/Function_Reference/wp_list/pages


2

मैंने एक पुनरावर्ती कार्य किया है जो सभी बच्चों को एक मूल पृष्ठ की आईडी देता है। हमारे पास आईडी होने के बाद, हम पृष्ठों के लिए क्वेरी बनाते हैं और मेटा कुंजी / मान द्वारा परिणाम ऑर्डर कर सकते हैं।

// Gets all the children ids of post_parent
function _get_children_ids( $post_parent ) {
    $results = new WP_Query( array(
        'post_type' => 'page',
        'post_parent' => $post_parent
    ) );

    $child_ids = array();
    if ( $results->found_posts > 0 )
        foreach ( $results->posts as $post ) // add each child id to array
            $child_ids[] = $post->ID;

    if ( ! empty( $child_ids ) )
        foreach ( $child_ids as $child_id ) // add further children to array
            $child_ids = array_merge( $child_ids, _get_children_ids( $child_id ) );

    return $child_ids;
}

$children_ids = _get_children_ids( 9 ); // use your numeric page id or get_the_id()

$results = new WP_Query( array(
    'post_type'   => 'page',
    'post__in'   => $children_ids
    #'meta_key'   => 'meta_key', // your meta key
    #'orderby'    => 'meta_key',
    /* 'meta_query' => array( // optional meta_query
        array(
            'key' => 'meta_key', // key
            'value' => array(3, 4), // values
            'compare' => 'IN', // operator
        )
    ) */
) );

var_dump( $results );

अगर आपको बच्चों को मेटा की / मान द्वारा श्रेणीबद्ध तरीके से क्रमबद्ध करने की आवश्यकता है, तो आपको मेटा_की और order_by मानों को WP_Query में _get_children_ids फ़ंक्शन (अंतिम WP --23 के बजाय) में पास करना चाहिए।

यदि नहीं, तो सभी बच्चे की आईडी प्राप्त करने की एक सरल विधि है:

$children = get_pages( 'child_of=9');

$children_ids = array();
if ( ! empty( $children ) )
    foreach ( $children as $post )
        $children_ids[] = $post->ID;

-1

मैं इस काम को कर रहा हूं, बस अपने पेज को कॉपी करने के लिए कोड को कॉपी करें

//REDIRECT TO FIRST CHILD FROM PARENT PAGE

// Build WP_Query() argument array
$page_tree_query_args = array(
    'post_parent' => $post -> ID,
    'post_type' => 'page',
    'order' => 'asc'
);
// Get child pages as a WP_Query() object
$page_tree_query = new WP_Query( $page_tree_query_args );
if(!empty($page_tree_query -> posts)){
    $first_subpage = $page_tree_query -> posts[0] -> ID;
    wp_redirect( get_permalink( $first_subpage ) );
    exit;   
}

यह ए) काम नहीं कर रहा है ( $post -> ID?), बी) जो नहीं पूछा गया था, सी) बहुत अच्छी तरह से नहीं समझाया गया।
tfrommen
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.