Ottenere categorie in ordine gerarchico come wp_list_categories - con nome, slug e link per modificare cat

7 feb 2012, 23:35:11
Visualizzazioni: 39.6K
Voti: 5

Ho bisogno di trovare un modo per elencare tutte le categorie - vuote o meno - in una lista gerarchica - come wp_list_categories - mostrando anche lo slug, il nome della categoria e un link per modificarla nell'amministrazione.

Ecco quello che ho finora:

$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 = 'Niente!' } );
    $cat_count = $category->count;

    echo '<p><strong>'.$cat_name.'</strong>';
    echo ' / <a href="' . get_category_link( $cat_ID ) . '" title="' . sprintf( __( "Visualizza tutti i post in %s" ), $cat_name ) . '" ' . '>Visualizza ( '. $cat_count . ' post )</a>  ';
    #echo ' / Desc: '. $cat_desc . '';
    echo ' / <a href="'. get_admin_url().'edit-tags.php?action=edit&taxonomy=category&tag_ID='.$cat_ID.'&post_type=post" title="Modifica Categoria">Modifica</a>';
    echo '</p>';  

}

Va tutto bene, ma non è ordinato in modo appropriato - è solo un elenco alfabetico.

0
Tutte le risposte alla domanda 4
10
14

output come lista non ordinata:

<?php

    hierarchical_category_tree( 0 ); // chiamata alla funzione; 0 per tutte le categorie; oppure ID categoria  

function hierarchical_category_tree( $cat ) {
    // wpse-41548 // alchymyth // una lista gerarchica di tutte le categorie //

  $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( __( "Visualizza tutti i post in %s" ), $cat->name ) . '" ' . '>Visualizza ( '. $cat->count . ' post )</a>  '; 
    echo ' / <a href="'. get_admin_url().'edit-tags.php?action=edit&taxonomy=category&tag_ID='.$cat->term_id.'&post_type=post" title="Modifica Categoria">Modifica</a>'; 
    hierarchical_category_tree( $cat->term_id );
    endforeach;    
  endif;

  echo '</li></ul>'; echo "\n";
}  
?>
8 feb 2012 00:23:46
Commenti

geniale! - sembra che hide_empty richieda un valore numerico per funzionare, il resto è perfetto - grazie!

Q Studio Q Studio
8 feb 2012 23:31:27

forse non correlato alla mia domanda originale, ma come potrei determinare il "livello" della gerarchia di categorie in cui si trova ogni categoria - ad esempio in una gerarchia a 3 livelli, avrei bisogno di ottenere 1, 2 o 3?

Q Studio Q Studio
9 feb 2012 00:03:24

http://pastebin.com/GbZFnytw - output della profondità aggiunto come classe css del tag ul

Michael Michael
9 feb 2012 00:24:28

fantastico - c'è un modo per annidare gli ul / li - in modo che si avvolgano tutti - mi piacerebbe provare a inserirli in una navigazione di tipo accordion con apertura/chiusura?

Q Studio Q Studio
10 feb 2012 00:50:32

per annidamento intendevo <ul><li><ul><li></li></ul></li></ul> - immagino tu l'abbia capito...

Q Studio Q Studio
10 feb 2012 11:00:59

nuovo codice http://pastebin.com/TTvYPKPH - corretto con codice aggiunto per output html strutturato - ignora il vecchio pastebin http://pastebin.com/GbZFnytw

Michael Michael
10 feb 2012 12:52:11

grazie ancora, potrei mandarti in privato il link a una pagina? Ho un'altra domanda, ma non voglio rendere pubblico l'URL.

Q Studio Q Studio
10 feb 2012 22:37:39

nessun problema - usa semplicemente l'email associata al mio username.

Michael Michael
10 feb 2012 23:39:38

dove posso trovare questa email?

Q Studio Q Studio
11 feb 2012 13:41:03

@Michael Molto bello! Grazie.

Ruvee Ruvee
5 apr 2021 05:48:49
Mostra i restanti 5 commenti
3

Una versione leggermente aggiornata della risposta di Michael per utilizzare la funzione più generica get_terms (così puoi ottenere tassonomie personalizzate, in questo caso volevo la tassonomia della categoria prodotto 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(__("Visualizza tutti i prodotti in %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;
}

Semplificato un po' per rimuovere il link di modifica ecc. Puoi aggiungerli se necessario.

9 ott 2015 13:17:16
Commenti

Errore: Errore fatale PHP catturabile: L'oggetto della classe WP_Error non può essere convertito in stringa. Su questa riga: foreach ($next as $cat).

Mehdi Mehdi
14 dic 2018 04:08:17

Sembra ottimo. Come potrei modificarlo per mostrare effettivamente il termine iniziale in cima alla lista? Attualmente mostra tutti i termini figli, giusto? Sto usando un ID termine diverso da 0, cioè un ID termine valido, non tutti.

Robert Andrews Robert Andrews
2 feb 2019 12:25:18

@deadlyhifi Ottimo! Ha funzionato perfettamente per me! Grazie.

Ruvee Ruvee
5 apr 2021 05:46:42
0

Puoi utilizzare il seguente codice:

$args = array(

    'hide_empty'         => 0,       // Mostra anche le categorie vuote
    'echo'               => 1,        // Output diretto
    'taxonomy'           => 'category', // Tassonomia categoria
    'hierarchical'  => 1,             // Mostra gerarchia
    'show_count' => 1,                // Mostra conteggio articoli

);

// Aggiunge classe "first" agli elementi li della lista categorie
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');

// Visualizza la lista delle categorie
echo wp_list_categories( $args );
15 giu 2019 11:21:40
2
-1

Credo che tu debba includere 'hierarchical' => 1, nella tua lista di argomenti. Inoltre hai una virgola di troppo alla fine della lista degli argomenti. Dopo l'ultimo argomento non serve la virgola :)

Ecco un esempio completo:

$args = array(
        'orderby'   => 'name', 
        'order'     => 'ASC', 
        'hierarchical' => 1,
        'hide_empty'    => '0'
  );
8 feb 2012 00:07:06
Commenti

Leggi di più su http://codex.wordpress.org/Function_Reference/get_categories :)

Ole Henrik Skogstrøm Ole Henrik Skogstrøm
8 feb 2012 00:07:57

Grazie - ma questo non li ordina gerarchicamente - il codex afferma: -- Quando true, i risultati includeranno sottocategorie vuote, purché queste sottocategorie abbiano sottocategorie che non sono vuote. Il valore predefinito è true. Valori validi:

Q Studio Q Studio
8 feb 2012 23:26:28