Получение иерархического списка категорий как wp_list_categories - с именем, ярлыком и ссылкой на редактирование

7 февр. 2012 г., 23:35:11
Просмотры: 39.6K
Голосов: 5

Мне нужно найти способ вывести все категории - пустые или нет - в виде иерархического списка - как wp_list_categories - также показывая ярлык, название категории и ссылку для редактирования в админке.

Вот что у меня есть на данный момент:

$args = array(
        'orderby'   => 'name',
        'order'     => 'ASC',
        'hide_empty'    => '0',
  );

$categories = get_categories($args);

foreach( $categories as $category ) { 

    $cat_ID = $category->term_id;
    $cat_name = $category->name;
    #$cat_desc = $category->description; if ( !$cat_desc { $cat_desc = 'Ничего!' } );
    $cat_count = $category->count;

    echo '<p><strong>'.$cat_name.'</strong>';
    echo ' / <a href="' . get_category_link( $cat_ID ) . '" title="' . sprintf( __( "Просмотреть все записи в %s" ), $cat_name ) . '" ' . '>Просмотр ( '. $cat_count . ' записей )</a>  ';
    #echo ' / Описание: '. $cat_desc . '';
    echo ' / <a href="'. get_admin_url().'edit-tags.php?action=edit&taxonomy=category&tag_ID='.$cat_ID.'&post_type=post" title="Редактировать категорию">Редактировать</a>';
    echo '</p>';  

}

Всё работает, но не упорядочено должным образом - просто алфавитный список.

0
Все ответы на вопрос 4
10
14

вывод в виде неупорядоченного списка:

<?php

    hierarchical_category_tree( 0 ); // вызов функции; 0 для всех категорий; или ID категории  

function hierarchical_category_tree( $cat ) {
    // wpse-41548 // alchymyth // иерархический список всех категорий //

  $next = get_categories('hide_empty=false&orderby=name&order=ASC&parent=' . $cat);

  if( $next ) :    
    foreach( $next as $cat ) :
    echo '<ul><li><strong>' . $cat->name . '</strong>';
    echo ' / <a href="' . get_category_link( $cat->term_id ) . '" title="' . sprintf( __( "Просмотреть все записи в %s" ), $cat->name ) . '" ' . '>Просмотр ( '. $cat->count . ' записей )</a>  '; 
    echo ' / <a href="'. get_admin_url().'edit-tags.php?action=edit&taxonomy=category&tag_ID='.$cat->term_id.'&post_type=post" title="Редактировать категорию">Редактировать</a>'; 
    hierarchical_category_tree( $cat->term_id );
    endforeach;    
  endif;

  echo '</li></ul>'; echo "\n";
}  
?>
8 февр. 2012 г. 00:23:46
Комментарии

гениально! - hide_empty, кажется, требует числового значения для работы, остальное идеально - спасибо!

Q Studio Q Studio
8 февр. 2012 г. 23:31:27

возможно, не связано с моим первоначальным вопросом, но как я могу определить "уровень" иерархии категорий для каждой категории - например, в 3-уровневой иерархии мне нужно получить 1, 2 или 3?

Q Studio Q Studio
9 февр. 2012 г. 00:03:24

http://pastebin.com/GbZFnytw - вывод глубины добавлен как css-класс тега ul

Michael Michael
9 февр. 2012 г. 00:24:28

отлично - есть ли способ вложить ul / li, чтобы они все обернулись - я хотел бы попробовать сделать их в виде навигации типа аккордеон с открытием/закрытием?

Q Studio Q Studio
10 февр. 2012 г. 00:50:32

под вложением я имел в виду <ul><li><ul><li></li></ul></li></ul> - думаю, вы уже догадались...

Q Studio Q Studio
10 февр. 2012 г. 11:00:59

новый код http://pastebin.com/TTvYPKPH - исправлен с добавленным кодом для структурированного html вывода - игнорируйте старый pastebin http://pastebin.com/GbZFnytw

Michael Michael
10 февр. 2012 г. 12:52:11

еще раз спасибо, могу ли я отправить вам в ЛС ссылку на страницу? У меня еще один вопрос, но не хочу публиковать URL.

Q Studio Q Studio
10 февр. 2012 г. 22:37:39

без проблем — используй email, привязанный к моему имени пользователя.

Michael Michael
10 февр. 2012 г. 23:39:38

где мне найти этот email?

Q Studio Q Studio
11 февр. 2012 г. 13:41:03

@Michael Очень красиво! Спасибо.

Ruvee Ruvee
5 апр. 2021 г. 05:48:49
Показать остальные 5 комментариев
3

Небольшая обновлённая версия ответа Майкла, использующая более универсальную функцию get_terms (чтобы можно было получать пользовательские таксономии, в данном случае мне нужна была таксономия категорий товаров WooCommerce product_cat).

echo hierarchical_term_tree();

function hierarchical_term_tree($category = 0)
{
    $r = '';

    $args = array(
        'parent' => $category,
    );

    $next = get_terms('product_cat', $args);

    if ($next) {
        $r .= '<ul>';

        foreach ($next as $cat) {
            $r .= '<li><a href="' . get_term_link($cat->slug, $cat->taxonomy) . '" title="' . sprintf(__("Просмотреть все товары в %s"), $cat->name) . '" ' . '>' . $cat->name . ' (' . $cat->count . ')' . '</a>';
            $r .= $cat->term_id !== 0 ? hierarchical_term_tree($cat->term_id) : null;
        }
        $r .= '</li>';

        $r .= '</ul>';
    }

    return $r;
}

Немного упрощено - убраны ссылки редактирования и т.п. Вы можете добавить их при необходимости.

9 окт. 2015 г. 13:17:16
Комментарии

Ошибка: PHP Catchable fatal error: Объект класса WP_Error не может быть преобразован в строку. В этой строке: foreach ($next as $cat).

Mehdi Mehdi
14 дек. 2018 г. 04:08:17

Выглядит хорошо. Как можно изменить код, чтобы он показывал начальный термин вверху списка? Сейчас он показывает все дочерние термины, верно? Я использую корректный ID термина (не нулевой), а не все термины.

Robert Andrews Robert Andrews
2 февр. 2019 г. 12:25:18

@deadlyhifi Отлично! Справился с задачей! Спасибо.

Ruvee Ruvee
5 апр. 2021 г. 05:46:42
0

Вы можете использовать следующий код:

$args = array(

    'hide_empty'         => 0,
    'echo'               => 1,
    'taxonomy'           => 'category',
    'hierarchical'  =>1,
    'show_count' => 1,

);

function add_class_wp_list_categories($wp_list_categories) {
        $pattern = '/<li class="/is';
        $replacement = '<li class="first ';
        return preg_replace($pattern, $replacement, $wp_list_categories);
}
add_filter('wp_list_categories','add_class_wp_list_categories');

echo wp_list_categories( $args );
15 июн. 2019 г. 11:21:40
2
-1

Хм, думаю, вам нужно добавить 'hierarchical' => 1, в список аргументов. Также у вас есть лишняя запятая в конце списка аргументов. После последнего аргумента запятая не нужна :)

Вот полный пример:

$args = array(
        'orderby'   => 'name', 
        'order'     => 'ASC', 
        'hierarchical' => 1,
        'hide_empty'    => '0'
  );
8 февр. 2012 г. 00:07:06
Комментарии

Подробнее на http://codex.wordpress.org/Function_Reference/get_categories :)

Ole Henrik Skogstrøm Ole Henrik Skogstrøm
8 февр. 2012 г. 00:07:57

Спасибо - но это не сортирует их иерархически - в codex указано: -- Когда true, результаты будут включать пустые подкатегории, если у этих подкатегорий есть непустые подкатегории. По умолчанию true. Допустимые значения:

Q Studio Q Studio
8 февр. 2012 г. 23:26:28