শ্রেণিবদ্ধ পদগুলির তালিকাটি কীভাবে প্রদর্শিত হবে?


34

আমার 'ভৌগলিক অবস্থানগুলি' নামে একটি শ্রেণিবিন্যাস সংক্রান্ত শ্রমশক্তি রয়েছে। এটিতে প্রথম স্তরের মহাদেশগুলি রয়েছে এবং তারপরে প্রত্যেকের জন্য দেশ রয়েছে। উদাহরণ:

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

প্রভৃতি

Get_terms () ব্যবহার করে আমি শর্তাদির সম্পূর্ণ তালিকা আউটপুট করতে সক্ষম হয়েছি, তবে মহাদেশগুলি একটি বড় ফ্ল্যাটের তালিকায় দেশগুলির সাথে মিশে গেছে।

আমি কীভাবে উপরের মতো শ্রেণিবিন্যাসের তালিকা আউটপুট করতে পারি?


2
যদি কারও স্তরের শ্রেণিবদ্ধ চেকলিস্টের প্রয়োজন হয় (তবে এখানে প্রশ্ন নয় তবে শ্রেণিবদ্ধ ট্যাক্সনোমির জন্য কাস্টম ইউআই তৈরি করা লোকদের জন্য সম্পর্কিত), সর্বোত্তম উত্তরটি হ'ল আপনার কাস্টম ট্যাক্সনোমির সাথে wp_terms_checklist () ব্যবহার করা।
জার্কার্ক

উত্তর:


19

যুক্তি wp_list_categoriesদিয়ে ব্যবহার করুন 'taxonomy' => 'taxonomy', এটি শ্রেণিবদ্ধ বিভাগের তালিকা তৈরির জন্য নির্মিত তবে এটি একটি কাস্টম শ্রেণীবিন্যাস ব্যবহার করে সমর্থন করবে ..

কোডেক্স উদাহরণ:
শুল্কে একটি স্বনির্ধারিত শৈলীতে প্রদর্শন করুন

যদি তালিকাটি সমতল দেখায় ফিরে আসে তবে তালিকাগুলিতে প্যাডিং যুক্ত করার জন্য আপনার কেবল সামান্য সিএসএস প্রয়োজন, যাতে আপনি তাদের শ্রেণিবদ্ধ কাঠামো দেখতে পারেন।


এটি কি বিপরীত হতে পারে? বাচ্চাদের প্রথমে প্রদর্শন করুন ..
আর্গ জিও

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সম্পত্তি ব্যবহার করে ।
নাহুয়েল

আমার মতো যদি আপনি এই ফাংশনটি বিভাগের একটি সাব-লেভেলে প্রয়োগ করার চেষ্টা করছেন তবে এটি কাজ করার জন্য আপনার বর্তমানে যে স্তরের অবস্থান করছেন তার আইডিতে আপনাকে পাস করতে হবে। তবে সুন্দরভাবে কাজ করুন, ধন্যবাদ @ পপসী।
বেন ইভার্ডার্ড

এটি কার্যকর, আপনাকে ধন্যবাদ
লুকা রেগেলিন

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>

আমি এটি পরীক্ষা করেছি না তবে আপনি কী দেখতে পাচ্ছেন তা দেখতে পারেন। উপরের কোডটি যা করবে তা আপনাকে কেবল দুটি স্তর দেয়

সম্পাদনা: আহ হ্যাঁ আপনি পরে যা করতে ডাব্লুপি_লিস্ট_ বিভাগগুলি () ব্যবহার করতে পারেন।


আসলে এটি বেশ কার্যকর, যেহেতু টার্ম লিঙ্কগুলিতে আমার কাস্টম লিঙ্কগুলি (একটি জিইটি পরম সহ) থাকা দরকার, যা ডাব্লুপি_লিস্ট_ বিভাগগুলি () করার পদ্ধতিতে সম্ভব বলে মনে হয় না।
মাইকে 23

1
হ্যাঁ এই পদ্ধতিটি আপনার আউটপুটকে আরও নিয়ন্ত্রণ দেবে। তবে আপনি wp_list_categories()আপনার জিইটি প্যারামিটারগুলিতে যুক্ত করার জন্য কিছু ভাল কিছু খুঁজে পেতে এবং প্রতিস্থাপন করতে পারেন। অথবা আপনার পছন্দের বিটগুলিতে যুক্ত করতে ফাংশনের জন্য আরও ভাল একটি ফিল্টার তৈরি করুন। আমাকে জিজ্ঞাসা করবেন না আপনি কীভাবে এটি করছেন কারণ আমি এখনও এর চারপাশে আমার মাথা পেতে সক্ষম হইনি :(
ব্র্যাডি

3
আমি ব্যবহার করার সুপারিশ করছি কাস্টম বিভাগ ভ্রমণকারী সঙ্গে wp_list_categoriesআপনি আউটপুট ভালো নিয়ন্ত্রণের চান, এটা আপনার কোড আরো অনেক কিছু পুনর্ব্যবহারযোগ্য করব ..
t31os

6

আপনি 'টেকনোমি' যুক্তি দিয়ে ডাব্লুপি_লিস্ট_ বিভাগগুলি () ব্যবহার করতে পারেন।


3

আমি যেমনটি খুঁজছিলাম কিন্তু একটি পোস্টের শর্তাবলী পেয়েছিলাম, অবশেষে আমি এটি সংকলন করেছি এবং এটি আমার পক্ষে কাজ করে।

এটি কী করে:
• এটি একটি নির্দিষ্ট পোস্টের জন্য একটি শ্রেণিবদ্ধ নামের সমস্ত শর্তাদি পায়।
Two দুটি স্তরের (যেমন: স্তর 1: 'দেশ' এবং স্তর 2: 'শহর') সহ একটি হাইরাফিকাল শৈলীর জন্য, এটি লেভেল 1 এর সাথে একটি h4 তৈরি করে তারপরে স্তর 2 এর একটি উল তালিকা এবং এটি সমস্ত স্তর 1 আইটেমের জন্য।
On যদি বিভাগটি শ্রেণিবদ্ধ না হয়, তবে এটি সমস্ত আইটেমের একটি উল তালিকা তৈরি করবে। এখানে কোডটি রয়েছে (আমি এটি আমার জন্য লিখছি তাই আমি যতটা সম্ভব জেনেরিক হওয়ার চেষ্টা করেছি তবে ...):

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>';
    };
};

সুতরাং অবশেষে আপনি এটি দিয়ে ফাংশনটি কল করবেন (স্পষ্টতই, আপনি আমার দ্বারা আমার_ট্যাক্সনোমি প্রতিস্থাপন করেছেন): finishingLister('my_taxonomy');

আমি এটি নিখুঁত ভান করি না তবে যেমনটি বলেছিলাম এটি আমার পক্ষে কাজ করে।


3

নিম্নলিখিত কোডটি শর্তাদি সহ ড্রপ-ডাউন উত্পন্ন করবে, তবে $ আউটপুটমেপ্লেট ভেরিয়েবল সম্পাদনা করে এবং 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

আমার এই সমস্যাটি ছিল এবং এখানে উত্তরগুলির কোনওোটাই আমার পক্ষে কাজ করে নি, একটি কারণ বা অন্য কারণে।

এখানে আমার আপডেট করা এবং কাজের সংস্করণ is

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

আমি @ পোপসি কোডটি ব্যবহার করেছি যা সত্যিই ভালভাবে কাজ করছে এবং আমি এটিকে আরও কার্যকর এবং সহজেই পড়তে সহজ করে তুলেছি:

/**
 * 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

-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
কেন এটি সমস্যার সমাধান করতে পারে দয়া করে তা ব্যাখ্যা করুন ।
ফুসিয়া

আমি মনে করি যুক্তিটি এটি সম্পর্কিত সমস্যা। আমি এই পোস্টটি কীভাবে বিভাগ-শৈলীর শ্রেণিবিন্যাসের চেকলিস্ট পেতে পারি তা জানার চেষ্টা করে দেখতে পেয়েছি এবং এখানে একটি উত্তর যুক্ত করার জন্য প্রলুব্ধ হয়েছি যে আমি এটি খুঁজে পেয়েছি। আমি যদিও তা করব না কারণ আপনি চিহ্নিত হিসাবে এটি OQ উত্তর দেয় না।
জার্কার্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.