Как показать иерархический список условий?

У меня есть иерархическая таксономия, названная 'географическими положениями'. Это содержит континенты на первом уровне и затем страны для каждого. Пример:

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

и т.д.

Используя get_terms () мне удалось произвести полный список терминов, но континенты путаются со странами в одном большом плоском списке.

Как я могу произвести иерархический список как вышеупомянутый?

34
15.05.2013, 11:18
8 ответов

Использовать wp_list_categories с 'taxonomy' => 'taxonomy' аргумент, это создается для создания иерархических списков категории, но будет также поддерживать использование пользовательской таксономии..

Пример кодекса:
Дисплей называет в пользовательской таксономии

Если список возвращается, выглядя плоским, возможно, что Вам просто нужно немного CSS для добавления дополнения к спискам, таким образом, Вы видите их иерархическую структуру.

19
19.02.2020, 21:54
  • 1
    Это могло быть инвертировано? Отобразите детей сначала.. –  Arg Geo 06.03.2016, 09:57

Я не знаю ни о какой функции, которая делает то, что Вы хотите, но можно создать что-то вроде этого:

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

Я не протестировал это, но Вы видите то, что я достигаю. То, что сделает вышеупомянутый код, дают Вам только два уровня

Править: ahh да можно использовать wp_list_categories (), чтобы сделать что Вы после.

10
19.02.2020, 21:54
  • 1
    На самом деле это довольно полезно, поскольку у меня должны быть настраиваемые ссылки (с ПОЛУЧИТЬ параметрическим усилителем) на термине ссылки, который не кажется возможным с wp_list_categories () способ сделать его. –  mike23 13.04.2011, 18:04
  • 2
    Да этот метод даст больше контроля Вашим выводом. Но Вы могли внести свою лепту, находят и заменяют на выводе wp_list_categories() включать Ваш ПОЛУЧАТЬ параметры. Или еще лучшая сборка фильтр для функции для добавления в битах Вы хотите. Не спрашивайте меня, как Вы делаете это, поскольку я еще не смог получить голову вокруг этого :( –  Brady 13.04.2011, 18:19
  • 3
    я предложил бы использовать пользовательскую категорию Уокер с wp_list_categories если Вы захотите большее управление выводом, то оно сделает Ваш код намного более допускающим повторное использование.. –  t31os 13.04.2011, 19:09

Можно использовать wp_list_categories () с аргументом 'таксономии'.

6
19.02.2020, 21:54

Убедитесь это hierarchical=true передается Вашему get_terms() звонить.

Отметьте это hierarchical=true значение по умолчанию, поэтому действительно, просто быть уверенным, что оно не было переопределено, чтобы быть false.

-1
19.02.2020, 21:54
  • 1
    Привет Микросхема, да 'иерархический' 'верна' по умолчанию. –  mike23 13.04.2011, 17:37
  • 2
    Можно ли предоставить ссылку на живой пример вывода? –  Chip Bennett 13.04.2011, 17:44
  • 3
    Комментарий ответа уехал почти два года назад?В самом деле? На самом деле это - предложенный ответ, даже если сформулированный как вопрос. Я отредактирую его, чтобы быть оператором, а не вопросом? –  Chip Bennett 12.02.2013, 01:22
  • 4
    get_terms() возвратит полный список терминов (как указанный OP), но не иерархический список, показывающий родителя / дочерние отношения согласно просьбе. –  jdm2112 17.03.2016, 07:00

Поскольку я искал то же, но получить условия одного сообщения, наконец я скомпилировал это, и оно работает на меня.

Что это делает:
• это получает все условия названия таксономии определенного сообщения.
• для hierachical таксономии с двумя уровнями (исключая: level1:'country' и level2:'cities'), это создает H-4 с level1, сопровождаемым списком ул. level2 и этого для всех level1 объектов.
• если таксономия не будет иерархической, то она создаст только список ул. всех объектов. вот код (я пишу это для меня так, я пытался быть столь универсальным, как я могу, но...):

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
19.02.2020, 21:54

Я понимаю, это - очень старый вопрос, но если у Вас есть потребность создать фактическую структуру условий, это могло бы быть полезным методом для Вас:

/**
 * 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);
44
19.02.2020, 21:54
  • 1
    Это на самом деле действительно хорошо. Я изменил бы одну вещь: $into[$cat->term_id] = $cat; в $into[] = $cat; При наличии идентификатора термина, поскольку ключ массива является раздражающим (Вы не можете получить первый элемент легко с помощью 0 ключей), и бесполезный (Вы уже храните $cat возразите и можно получить идентификатор с помощью term_id свойство. –  Nahuel 07.03.2017, 17:03
  • 2
    , Если как я Вы попытаетесь применить эту функцию к подуровню категорий, то необходимо будет передать в идентификаторе уровня, который Вы в настоящее время в том, чтобы это работало. Но работа приятно это делает, @popsi спасибо. –  Ben Everard 16.08.2018, 13:19
  • 3
    , который работает, спасибо –  Luca Reghellin 12.11.2019, 18:35

Здесь у меня есть четыре уровня выпадающий список выборки со скрытым первым объектом

<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>
-1
19.02.2020, 21:54
  • 1
    Объясните, почему это могло решить проблему. –  fuxia♦ 25.03.2013, 12:00
  • 2
    я думаю логика, - то, что это - связанная проблема. Я нашел это сообщение, пытающееся выяснять, как получить стиль категории иерархический контрольный список и испытываю желание добавить ответ здесь теперь, когда я понял это. Я не буду хотя, потому что, поскольку Вы указываете на это, не отвечает на OQ –  jerclarke 23.02.2016, 18:26

У меня была эта проблема, и ни один из ответов здесь не работал на меня по той или иной причине.

Вот моя обновленная и рабочая версия.

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
19.02.2020, 21:54

Теги

Похожие вопросы