किसी कस्टम टैक्सोनॉमी शब्द का शीर्ष-स्तरीय पैरेंट प्राप्त करें


14

मुझे किसी दिए गए शब्द का शीर्ष-स्तरीय माता-पिता कैसे मिलेगा?

मैं wp_get_object_termsपदों पर वर्गीकरण की शर्तें प्राप्त करने के लिए उपयोग कर रहा हूं , लेकिन सभी टैग की गई शर्तों को दिखाने के बजाय, मैं केवल टैग किए गए शब्दों को शीर्ष स्तर के माता-पिता को दिखाना चाहता हूं।

इसलिए यदि ये मेरे चयनित शब्द हैं, तो मैं केवल ब्रेकफास्ट, लंच और डिनर दिखाना चाहता हूं।

x BREAKFAST
   x Cereal
   x Eggs
  LUNCH
     Hamburger
   x Pizza
  DINNER
     Fish
        Bass
      x Salmon
        Trout
     Lasagna

मैं यह कैसे कर सकता हूँ?

जवाबों:


22

इस कोड के लिए Ivaylo का धन्यवाद, जो बैनटेनट के उत्तर पर आधारित था।

नीचे दिया गया पहला कार्य, get_term_top_most_parentएक शब्द और वर्गीकरण को स्वीकार करता है और शब्द के शीर्ष-स्तरीय माता-पिता (या स्वयं शब्द, यदि यह अभिभावक है) को वापस करता है; दूसरा फ़ंक्शन ( get_top_parents) लूप में काम करता है, और, एक वर्गीकरण को देखते हुए, पोस्ट की शर्तों के शीर्ष-स्तरीय माता-पिता की एक HTML सूची देता है।

// Determine the top-most parent of a term
function get_term_top_most_parent( $term, $taxonomy ) {
    // Start from the current term
    $parent  = get_term( $term, $taxonomy );
    // Climb up the hierarchy until we reach a term with parent = '0'
    while ( $parent->parent != '0' ) {
        $term_id = $parent->parent;
        $parent  = get_term( $term_id, $taxonomy);
    }
    return $parent;
}

एक बार जब आप ऊपर का कार्य कर लेते हैं, तो आप लौटे परिणामों पर लूप कर सकते हैं wp_get_object_termsऔर प्रत्येक शब्द के शीर्ष अभिभावक को प्रदर्शित कर सकते हैं :

function get_top_parents( $taxonomy ) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    $top_parent_terms = array();

    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term, $taxonomy );
        //check if you have it in your array to only add it once
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }

    // build output (the HTML is up to you)
    $output = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          //Add every term
          $output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
    $output .= '</ul>';

    return $output;
}

मैं एक संशोधन देखना पसंद करूंगा जो शीर्ष-स्तरीय शब्दों को प्रिंट नहीं करेगा, बल्कि, शीर्ष-सबसे माता-पिता के नीचे सभी शब्दों को, पदानुक्रम से।
— रॉबर्ट एंड्रयूज

@RobertAndrews यदि आपको सिर्फ एक ही शब्द के बच्चों की आवश्यकता है, तो आप वर्डप्रेस के बिल्ट-इन get_term_children( $term, $taxonomy )( प्रलेखन ) का उपयोग कर सकते हैं । आप किसी दिए गए अवधि के शीर्ष स्तरीय माता पिता के सभी बच्चों को पाने के लिए करना चाहता था, तो आप इस तरह इसे में ऊपर परिणाम दे सकते हैं,: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy )।
— सुपर

इस मामले में $ टर्म क्या है, अर्थात। ऑब्जेक्ट, शब्द का नाम, उपसर्ग taxonomyname_number? सभी मामलों में, यह विधि लोड करने के लिए बेहद लंबी है। मैं अब कई मिनट तक पेज लोड होने की प्रतीक्षा कर रहा हूं।
— रॉबर्ट एंड्रयूज 21

1
जैसा कि मूल रूप से लिखा गया है कि यह एक आईडी की उम्मीद करता है, लेकिन मैंने एक टर्म आईडी या WP_Term ऑब्जेक्ट की अनुमति देने के लिए उत्तर को संपादित किया। आप इस कोड के साथ केवल एक समस्या की रिपोर्ट नहीं कर रहे हैं - आदर्श रूप से WP के अंतर्निहित get_ancestorsफ़ंक्शन का उपयोग करने के लिए इसे फिर से लिखा जाना चाहिए , जो उत्तर लिखे जाने पर नया और अच्छी तरह से प्रलेखित नहीं था। जब मैंने परीक्षण करने का समय लिया है तो मैं एक नया उत्तर दूंगा।
— सुपरट्र्यू

21

3.1.0 के बाद get_ancestors()से उपलब्ध है। यह पितरों की एक सरणी को पदानुक्रम में सबसे कम से उच्चतम तक लौटाता है।


1
मेरी राय में यह सही उत्तर है।
— numediaweb

1
यह सबसे अच्छा जवाब है।
— मार्क

8

यहाँ एक सरल कार्य है जो आपको किसी भी पद के सबसे मूल शब्द मिलेगा:

function get_term_top_most_parent( $term_id, $taxonomy ) {
    $parent  = get_term_by( 'id', $term_id, $taxonomy );
    while ( $parent->parent != 0 ){
        $parent  = get_term_by( 'id', $parent->parent, $taxonomy );
    }
    return $parent;
}

एक बार जब आपके पास यह फ़ंक्शन होता है, तो आप अपने द्वारा लौटाए गए परिणामों पर लूप कर सकते हैं wp_get_object_terms:

$terms =  wp_get_object_terms( $post->ID, 'taxonomy' );
$top_parent_terms = array();
foreach ( $terms as $term ) {

    //Get top level parent
    $top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );

    //Check if you have it in your array to only add it once
    if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
        $top_parent_terms[] = $top_parent;
    }
}

धन्यवाद! मैं अब यही कोशिश कर रहा हूं। FYI करें मुझे लगता है कि आप फ़ंक्शन के पंक्ति 1 में एक करीबी पार्न को याद कर रहे हैं।
— सुपरसेट

क्या मुझे $ top_parent में दूसरे पैरामीटर के रूप में $ taxonomy जोड़ने की आवश्यकता है?
— supertrue

मैंने $ taxonomy पैरामीटर जोड़ा, लेकिन जब मैं इस कोड का उपयोग कर रहा हूँ तो मुझे एक त्रुटि मिल रही है: gist.github.com/1122631
— supertrue

हाँ आप करते हैं। मैंने जवाब अपडेट किया।
— बैनटेनट

1
आपके कार्य को लगता है कि आपका फ़ॉरच्यूअल लूप टूट गया है, इसे ओवरलैप करने की कोशिश कर रहे हैं: pastebin.com/u48dxzap और यदि आपको अभी भी एक त्रुटि पेस्ट मिल गया है, तो आप सभी को कोड कर देंगे और मैं जाँच
— लूंगा

5
/**
 * Get top level term
 */
function get_top_level_term($term,$taxonomy){
    if($term->parent==0) return $term;
    $parent = get_term( $term->parent,$taxonomy);
    return get_top_level_term( $parent , $taxonomy );
}

1
कृपया अपने कोड के साथ एक स्पष्टीकरण जोड़ें।
— s_ha_dum

4

मुझे भी यही समस्या थी और मैंने आसानी से हल किया। इसकी जांच करें:

परिभाषित करें $taxonomy। यह डेटा प्राप्त करने के लिए इच्छित वर्गीकरण का स्लग हो सकता है। ऐसा करने के बाद, आप बस यह कर सकते हैं:

<?php
    $postterms = wp_get_post_terms($post->ID, $taxonomy);   // get post terms
    $parentId = $postterms[0]->parent;                      // get parent term ID
    $parentObj = get_term_by('id', $parentId, $taxonomy);   // get parent object 
?>

अब आपको कुछ इस तरह मिला:

object(stdClass)#98 (11) {
  ["term_id"]=>
  int(3)
  ["name"]=>
  string(8) "Esportes"
  ["slug"]=>
  string(8) "esportes"
  ["term_group"]=>
  int(0)
  ["term_taxonomy_id"]=>
  int(3)
  ["taxonomy"]=>
  string(17) "noticiaseditorias"
  ["description"]=>
  string(0) ""
  ["parent"]=>
  int(0)
  ["count"]=>
  int(4)
  ["object_id"]=>
  int(123)
  ["filter"]=>
  string(3) "raw"
}

और आप $parentObjस्लग, नाम, आईडी, जो भी हो उपयोग कर सकते हैं । केवल उपयोग करके $parentObj->slugया छूट के $parentObj->nameरूप में।



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.