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


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.