एक पदानुक्रमित शब्दों की सूची कैसे दिखाएं?


34

मेरे पास 'भौगोलिक स्थानों' नामक एक श्रेणीबद्ध वर्गीकरण है। इसमें पहले स्तर पर महाद्वीप हैं, और फिर हर एक के लिए देश। उदाहरण :

Europe
- Ireland
- Spain
- Sweden
Asia
- Laos
- Thailand
- Vietnam

आदि।

Get_terms () का उपयोग करके मैं शर्तों की पूरी सूची का उत्पादन करने में कामयाब रहा, लेकिन महाद्वीपों को एक फ्लैट फ्लैट सूची में देशों के साथ मिलाया जाता है।

मैं ऊपर की तरह एक पदानुक्रमित सूची कैसे आउटपुट कर सकता हूं?


2
यदि किसी को पदानुक्रमित CHECKLIST (यहाँ सवाल नहीं है, लेकिन पदानुक्रमित वर्गीकरणों के लिए कस्टम UI बनाने वाले लोगों के लिए) से संबंधित है, तो सबसे अच्छा उत्तर यह है कि अपने कस्टम स्वायत्तता के साथ wp_terms_checklist () का उपयोग करें।
jerclarke

जवाबों:


19

तर्क के wp_list_categoriesसाथ प्रयोग करें 'taxonomy' => 'taxonomy', यह श्रेणीबद्ध श्रेणी सूचियों को बनाने के लिए बनाया गया है, लेकिन कस्टम टैक्सोनॉमी का उपयोग करके भी समर्थन करेगा।

कोडेक्स उदाहरण:
एक कस्टम वर्गीकरण में शब्द प्रदर्शित करें

यदि सूची सपाट दिख रही है, तो संभव है कि आपको सूचियों में पैडिंग जोड़ने के लिए बस थोड़ी सीएसएस की आवश्यकता हो, ताकि आप उनकी पदानुक्रमित संरचना देख सकें।


क्या इससे उलटा हो सकता है? पहले बच्चों को प्रदर्शित करें ..
Arg Geo

43

मुझे एहसास है, यह एक बहुत पुराना सवाल है, लेकिन अगर आपको शर्तों की वास्तविक संरचना बनाने की आवश्यकता है , तो यह आपके लिए एक उपयोगी तरीका हो सकता है:

/**
 * Recursively sort an array of taxonomy terms hierarchically. Child categories will be
 * placed under a 'children' member of their parent term.
 * @param Array   $cats     taxonomy term objects to sort
 * @param Array   $into     result array to put them in
 * @param integer $parentId the current parent ID to put them in
 */
function sort_terms_hierarchically(Array &$cats, Array &$into, $parentId = 0)
{
    foreach ($cats as $i => $cat) {
        if ($cat->parent == $parentId) {
            $into[$cat->term_id] = $cat;
            unset($cats[$i]);
        }
    }

    foreach ($into as $topCat) {
        $topCat->children = array();
        sort_terms_hierarchically($cats, $topCat->children, $topCat->term_id);
    }
}

उपयोग निम्नानुसार है:

$categories = get_terms('my_taxonomy_name', array('hide_empty' => false));
$categoryHierarchy = array();
sort_terms_hierarchically($categories, $categoryHierarchy);

var_dump($categoryHierarchy);

3
यह वास्तव में वास्तव में अच्छा है। मैं एक चीज़ $into[$cat->term_id] = $cat;को $into[] = $cat;बदलूंगा : शब्द की आईडी में होने से सरणी कुंजी कष्टप्रद है (आप 0 कुंजी का उपयोग करके आसानी से पहला तत्व प्राप्त नहीं कर सकते हैं) और बेकार (आप पहले से ही $catवस्तु संग्रहीत कर रहे हैं और आप आईडी प्राप्त कर सकते हैं term_idसंपत्ति का उपयोग करना ।
नहुएल

अगर मेरी तरह आप इस फ़ंक्शन को उप-स्तर की श्रेणियों में लागू करने का प्रयास कर रहे हैं, तो आपको उस स्तर की आईडी में पास करना होगा जो आप वर्तमान में इस काम के लिए कर रहे हैं। लेकिन अच्छी तरह से काम करता है, धन्यवाद @popsi।
बेन एवरार्ड

यह काम करता है, धन्यवाद
Luca Reghellin

10

मैं किसी भी फ़ंक्शन के बारे में नहीं जानता, जो आप चाहते हैं, लेकिन आप कुछ इस तरह से बना सकते हैं:

<ul>
    <?php $hiterms = get_terms("my_tax", array("orderby" => "slug", "parent" => 0)); ?>
    <?php foreach($hiterms as $key => $hiterm) : ?>
        <li>
            <?php echo $hiterm->name; ?>
            <?php $loterms = get_terms("my_tax", array("orderby" => "slug", "parent" => $hiterm->term_id)); ?>
            <?php if($loterms) : ?>
                <ul>
                    <?php foreach($loterms as $key => $loterm) : ?>
                        <li><?php echo $loterm->name; ?></li>
                    <?php endforeach; ?>
                </ul>
            <?php endif; ?>
        </li>
    <?php endforeach; ?>
</ul>

मैंने इसका परीक्षण नहीं किया है लेकिन आप देख सकते हैं कि मुझे क्या मिल रहा है। उपरोक्त कोड क्या करेगा आपको केवल दो स्तर देगा

संपादित करें: आह हाँ आप wp_list_categories () का उपयोग कर सकते हैं कि आप क्या करते हैं।


वास्तव में यह काफी उपयोगी है, क्योंकि मुझे टर्म लिंक्स पर कस्टम लिंक (जीईटी परम के साथ) की आवश्यकता है, जो कि wp_list_categories () करने के तरीके से संभव नहीं लगता है।
माइक 23

1
हाँ यह विधि आपके आउटपुट पर अधिक नियंत्रण देगी। लेकिन आप कुछ अच्छा सा खोज कर सकते हैं और wp_list_categories()अपने GET मापदंडों में जोड़ने के आउटपुट पर प्रतिस्थापित कर सकते हैं । या इससे भी बेहतर फ़ंक्शन के लिए एक फिल्टर का निर्माण करें जो आप चाहते हैं बिट्स में जोड़ें। मुझे मत पूछो कि तुम ऐसा कैसे करते हो क्योंकि मैं अभी तक इसके चारों ओर अपना सिर पाने में सक्षम नहीं हूं :(
ब्रैडी

3
मैं एक का उपयोग कर सुझाव देंगे कस्टम श्रेणी वॉकर के साथ wp_list_categoriesआप उत्पादन पर अधिक नियंत्रण चाहते हैं, तो यह आपके कोड और अधिक पुन: प्रयोज्य बनाती हूँ ..
t31os

6

आप 'taxonomy' तर्क के साथ wp_list_categories () का उपयोग कर सकते हैं।


3

जैसा कि मैं उसी के लिए देख रहा था लेकिन एक पद की शर्तों को पाने के लिए, आखिरकार मैंने इसे संकलित किया, और यह मेरे लिए काम करता है।

यह क्या करता है:
• यह एक विशिष्ट पद के लिए एक वर्गीकरण नाम की सभी शर्तें प्राप्त करता है।
• दो स्तरों के साथ एक श्रेणीबद्ध वर्गीकरण के लिए (उदा: स्तर 1: 'देश' और स्तर 2: 'शहर'), यह स्तर 1 के साथ स्तर 2 की उल सूची और इसके बाद सभी स्तर 1 आइटम के साथ एक एच 4 बनाता है।
• यदि वर्गीकरण स्वायत्त नहीं है, तो यह सभी वस्तुओं की केवल एक अंतिम सूची बनाएगा। यहाँ कोड है (मैं इसे मेरे लिए लिखता हूं इसलिए मैंने उतना ही सामान्य होने की कोशिश की जितनी मैं कर सकता हूं ...):

function finishingLister($heTerm){
    $myterm = $heTerm;
    $terms = get_the_terms($post->ID,$myterm);
    if($terms){
        $count = count($terms);
        echo '<h3>'.$myterm;
        echo ((($count>1)&&(!endswith($myterm, 's')))?'s':"").'</h3>';
        echo '<div class="'.$myterm.'Wrapper">';
        foreach ($terms as $term) {
            if (0 == $term->parent) $parentsItems[] = $term;
            if ($term->parent) $childItems[] = $term; 
        };
        if(is_taxonomy_hierarchical( $heTerm )){
            foreach ($parentsItems as $parentsItem){
                echo '<h4>'.$parentsItem->name.'</h4>';
                echo '<ul>';
                foreach($childItems as $childItem){
                    if ($childItem->parent == $parentsItem->term_id){
                        echo '<li>'.$childItem->name.'</li>';
                    };
                };
                echo '</ul>';
            };
        }else{
            echo '<ul>';
            foreach($parentsItems as $parentsItem){
                echo '<li>'.$parentsItem->name.'</li>';
            };
            echo '</ul>';
        };
        echo '</div>';
    };
};

तो अंत में आप इस के साथ फ़ंक्शन को बुलाते हैं (जाहिर है, आप my_taxonomy को आपके द्वारा प्रतिस्थापित करते हैं): finishingLister('my_taxonomy');

मैं यह सही नहीं है, लेकिन जैसा कि मैंने कहा कि यह मेरे लिए काम करता है।


3

निम्न कोड शब्दों के साथ ड्रॉप-डाउन उत्पन्न करेगा, लेकिन $ outputTemplate चर को संपादित करके और str_replace लाइनों को संपादित करके किसी अन्य तत्व / संरचना को भी उत्पन्न कर सकता है:

function get_terms_hierarchical($terms, $output = '', $parent_id = 0, $level = 0) {
    //Out Template
    $outputTemplate = '<option value="%ID%">%PADDING%%NAME%</option>';

    foreach ($terms as $term) {
        if ($parent_id == $term->parent) {
            //Replacing the template variables
            $itemOutput = str_replace('%ID%', $term->term_id, $outputTemplate);
            $itemOutput = str_replace('%PADDING%', str_pad('', $level*12, '&nbsp;&nbsp;'), $itemOutput);
            $itemOutput = str_replace('%NAME%', $term->name, $itemOutput);

            $output .= $itemOutput;
            $output = get_terms_hierarchical($terms, $output, $term->term_id, $level + 1);
        }
    }
    return $output;
}

$terms = get_terms('taxonomy', array('hide_empty' => false));
$output = get_terms_hierarchical($terms);

echo '<select>' . $output . '</select>';  

1

मुझे यह समस्या थी और यहाँ कोई भी उत्तर मेरे लिए, एक कारण या किसी अन्य के लिए काम नहीं करता था।

यहां मेरा अपडेटेड और वर्किंग वर्जन है।

function locationSelector( $fieldName ) {
    $args = array('hide_empty' => false, 'hierarchical' => true, 'parent' => 0); 
    $terms = get_terms("locations", $args);

    $html = '';
    $html .= '<select name="' . $fieldName . '"' . 'class="chosen-select ' . $fieldName . '"' . '>';
        foreach ( $terms as $term ) {
            $html .= '<option value="' . $term->term_id . '">' . $term->name . '</option>';

            $args = array(
                'hide_empty'    => false, 
                'hierarchical'  => true, 
                'parent'        => $term->term_id
            ); 
            $childterms = get_terms("locations", $args);

            foreach ( $childterms as $childterm ) {
                $html .= '<option value="' . $childterm->term_id . '">' . $term->name . ' > ' . $childterm->name . '</option>';

                $args = array('hide_empty' => false, 'hierarchical'  => true, 'parent' => $childterm->term_id); 
                $granchildterms = get_terms("locations", $args);

                foreach ( $granchildterms as $granchild ) {
                    $html .= '<option value="' . $granchild->term_id . '">' . $term->name . ' > ' . $childterm->name . ' > ' . $granchild->name . '</option>';
                }
            }
        }
    $html .=  "</select>";

    return $html;
}

और उपयोग:

$selector = locationSelector('locationSelectClass');
echo $selector;

1

मैंने @popsi कोड का उपयोग किया था जो वास्तव में अच्छी तरह से काम कर रहा था और मैंने इसे और अधिक कुशल और पढ़ने में आसान बनाया:

/**
 * Recursively sort an array of taxonomy terms hierarchically. Child categories will be
 * placed under a 'children' member of their parent term.
 * @param Array   $cats     taxonomy term objects to sort
 * @param integer $parentId the current parent ID to put them in
 */
function sort_terms_hierarchicaly(Array $cats, $parentId = 0)
{
    $into = [];
    foreach ($cats as $i => $cat) {
        if ($cat->parent == $parentId) {
            $cat->children = sort_terms_hierarchicaly($cats, $cat->term_id);
            $into[$cat->term_id] = $cat;
        }
    }
    return $into;
}

उपयोग:

$sorted_terms = sort_terms_hierarchicaly($terms);

-1

सुनिश्चित करें कि hierarchical=trueआपके get_terms()कॉल को पास किया गया है ।

ध्यान दें कि hierarchical=trueयह डिफ़ॉल्ट है, इसलिए वास्तव में, बस सुनिश्चित करें कि यह होना अतिदेय नहीं है false


हाई चिप, हां 'हायरार्चिकल' डिफ़ॉल्ट रूप से 'सही' है।
मिक 23

क्या आप आउटपुट के जीवंत उदाहरण के लिए एक लिंक प्रदान कर सकते हैं?
चिप बेनेट

लगभग दो साल पहले एक उत्तर पर टिप्पणी करना? वास्तव में? वास्तव में, यह है एक प्रस्तावित जवाब भले ही एक सवाल के रूप में शब्दों में,। क्या मैं इसे एक प्रश्न के बजाय एक कथन होने के लिए संपादित कर सकता हूँ?
चिप बैनेट

get_terms()शर्तों की पूरी सूची वापस कर देंगे (जैसा कि ओपी ने कहा है) लेकिन माता-पिता / बच्चे के संबंध के रूप में अनुरोध की गई एक पदानुक्रमित सूची नहीं है।
jdm2112 5

-1

यहां मेरे पास छिपे हुए पहले आइटम के साथ चार स्तरीय ड्रॉपडाउन चयन सूची है

<select name="lokalizacja" id="ucz">
            <option value="">Wszystkie lokalizacje</option>
            <?php
            $excluded_term = get_term_by('slug', 'podroze', 'my_travels_places');
            $args = array(
                'orderby' => 'slug',
                'hierarchical' => 'true',
                'exclude' => $excluded_term->term_id,
                'hide_empty' => '0',
                'parent' => $excluded_term->term_id,
            );              
            $hiterms = get_terms("my_travels_places", $args);
            foreach ($hiterms AS $hiterm) :
                echo "<option value='".$hiterm->slug."'".($_POST['my_travels_places'] == $hiterm->slug ? ' selected="selected"' : '').">".$hiterm->name."</option>\n";

                $loterms = get_terms("my_travels_places", array("orderby" => "slug", "parent" => $hiterm->term_id,'hide_empty' => '0',));
                if($loterms) :
                    foreach($loterms as $key => $loterm) :

                    echo "<option value='".$loterm->slug."'".($_POST['my_travels_places'] == $loterm->slug ? ' selected="selected"' : '').">&nbsp;-&nbsp;".$loterm->name."</option>\n";

                    $lo2terms = get_terms("my_travels_places", array("orderby" => "slug", "parent" => $loterm->term_id,'hide_empty' => '0',));
                    if($lo2terms) :
                        foreach($lo2terms as $key => $lo2term) :

                        echo "<option value='".$lo2term->slug."'".($_POST['my_travels_places'] == $lo2term->slug ? ' selected="selected"' : '').">&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;".$lo2term->name."</option>\n";



                        endforeach;
                    endif;

                    endforeach;
                endif;

            endforeach;
            ?>
         </select>
        <label>Wybierz rodzaj miejsca</label>
        <select name="rodzaj_miejsca" id="woj">
            <option value="">Wszystkie rodzaje</option>
            <?php
            $theterms = get_terms('my_travels_places_type', 'orderby=name');
            foreach ($theterms AS $term) :
                echo "<option value='".$term->slug."'".($_POST['my_travels_places_type'] == $term->slug ? ' selected="selected"' : '').">".$term->name."</option>\n";                   
            endforeach;
            ?>
         </select>

2
कृपया बताएं कि समस्या का समाधान क्यों हो सकता है।
FUXIA

मुझे लगता है कि तर्क यह है कि यह एक संबंधित समस्या है। मैंने पाया कि यह पोस्ट एक श्रेणी-शैली पदानुक्रमित चेकलिस्ट पाने की कोशिश कर रही है और मुझे यहाँ एक उत्तर जोड़ने के लिए लुभाया गया है कि मैंने इसे समझ लिया है। मैं हालांकि नहीं होगा क्योंकि आप बताते हैं कि यह OQ का जवाब नहीं देता है।
jerclarke
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.