Come Ottenere lo Slug della Categoria Genitore del Post Corrente

25 gen 2014, 23:40:08
Visualizzazioni: 92.2K
Voti: 16

Il mio tema applica stili in base alla categoria utilizzando il seguente codice, che inserisce lo slug della categoria corrente come classe CSS.

<div class="CategorySpecificStyle 
    <?php $category = get_the_category(); echo $category[0]->slug; ?>">
        <?php echo $category[0]->cat_name; ?>
</div> 

Sto per aggiungere un gran numero di nuove sotto-categorie, e sembra assurdo doverle aggiungere tutte in CSS quando potrei semplicemente selezionare la categoria genitore del post corrente e applicare gli stili a quella.

Sono riuscito a ottenere il nome della categoria genitore:

$parentcat = get_cat_name($category[0]->category_parent);

Ma gli spazi (e le maiuscole/minuscole) sono un problema... E non riesco a ottenere lo slug della categoria genitore.

So che probabilmente mi sto perdendo un passaggio semplice da qualche parte, ma qualsiasi suggerimento sarebbe molto apprezzato.

0
Tutte le risposte alla domanda 9
0
26

Dovrai utilizzare il valore ID restituito da $category[0]->category_parent e passarlo attraverso get_term(). Esempio:

$category = get_the_category(); 
$category_parent_id = $category[0]->category_parent;
if ( $category_parent_id != 0 ) {
    $category_parent = get_term( $category_parent_id, 'category' );
    $css_slug = $category_parent->slug;
} else {
    $css_slug = $category[0]->slug;
}
26 gen 2014 00:28:52
2

Dovrai interrogare i dati della categoria genitore. La funzione get_category è praticamente costruita per questo scopo.

$category = get_the_category(); 
$parent = get_category($category[0]->category_parent);
echo $parent->slug;

Questo codice restituirà il genitore diretto della categoria. Considerando questo insieme di categorie:

  • Cartone animato
    • Cane
      • Scooby

Il codice sopra restituirà "Cane" se gli viene fornito l'ID per "Scooby". Se vuoi ottenere la categoria genitore più in alto — "Cartone animato" — indipendentemente dal livello di annidamento, usa qualcosa come questo:

$category = get_the_category(); 
$parent = get_ancestors($category[0]->term_id,'category');
if (empty($parent)) {
  $parent[] = array($category[0]->term_id);
}
$parent = array_pop($parent);
$parent = get_category($parent); 
if (!is_wp_error($parent)) {
  var_dump($parent);
} else {
  echo $parent->get_error_message();
}

Questo approccio ha anche il vantaggio di una gestione degli errori relativamente pulita.

26 gen 2014 00:22:07
Commenti

Grazie per la risposta, e probabilmente utilizzerò uno snippet simile in futuro, ma genera anche errori se il post è in una categoria genitore / categoria senza sottocategorie.

DLR DLR
26 gen 2014 02:10:03

@DLR: Sì, lo so. Ho dovuto andare via prima di poter completare la risposta. Stavo lavorando a qualcosa di più complesso e robusto. Vedi la modifica.

s_ha_dum s_ha_dum
26 gen 2014 02:30:13
0

Ho scoperto che la maggior parte delle soluzioni sopra non funzionava per i Custom Post Type. Quindi ho scritto la seguente funzione.

Dato l'ID della categoria corrente (figlia), risale la catena per restituire i genitori della categoria. Restituisce un array contenente url, nome, slug e ID dei genitori.

/**
 * @param $category_id
 *
 * @return array        Restituisce un array vuoto se non ci sono genitori oppure
 *                      un array di categorie dalla categoria base[0] alla categoria genitore
 *                      L'array contiene un sotto array con ['id'] ['name'] ['slug'] ['url']
 *
 */

function get_category_parent_array( $category_id, $category_taxonomy = 'category'){

    $category_id = abs((int)$category_id);
    $category_taxonomy = sanitize_key( $category_taxonomy);
    
    // Controllo di sicurezza per il genitore superiore - ( id = 0 )
    if( 0 == $category_id ){
        return array();
    }

    $child_category = get_term( $category_id, $category_taxonomy);
    if( empty($child_category)){
        return array();
    }

    $parent_category_id = $child_category->parent;
    if( 0 == $parent_category_id ){
        return array(); // Non possiamo ottenere la categoria 0.
    }


    // Abbiamo controllato se parent_id è 0 ma facciamo un doppio controllo qui per altri problemi che causano categorie genitore vuote
    $parent_category = get_term( $parent_category_id, $category_taxonomy);
    if ( empty ( $parent_category ) ){
        return array();
    }

    // Prepara l'array di ritorno
    $parent_array = array();

    $parent_array['id'] =   $parent_category_id;
    $parent_array['slug'] = esc_attr($parent_category->slug);
    $parent_array['name'] = esc_attr($parent_category->name);
    $parent_array['url'] =  esc_url(get_term_link( $parent_category));

    if ( 0 == $parent_category_id ){
        return $parent_array;
    }else{
        $new_parent = get_category_parent_array($parent_category_id, $category_taxonomy );
        if(! empty( $new_parent ) ){
            return array( $new_parent, $parent_array);
        }else{
            return $parent_array;
        }

    }

}

Ad esempio. In un albero di Home>Prodotti>Borse-Di-Plastica>Borse-Polietilene>Borse-3mu Dove la categoria figlio/corrente è 3mu restituisce quanto segue:


array (
  0 => 
  array (
    'id' => 260,
    'slug' => 'borse-di-plastica',
    'name' => 'Borse Di Plastica',
    'url' => 'https://example.com/product_category/borse-di-plastica/',
  ),
  1 => 
  array (
    'id' => 261,
    'slug' => 'borse-polietilene',
    'name' => 'Borse Polietilene',
    'url' => 'https://exmapl.com/product_category/borse-polietilene/',
  ),
);

9 mag 2023 05:02:19
0

Mi piace la risposta precedente di @s_ha_dum, ma per ottenere la categoria di livello superiore indipendentemente dalla profondità, ho usato quella che considero una soluzione più semplice:

$cats = get_the_category();
foreach ( $cats as $cat ) {
    if ( $cat->category_parent == 0 ) {
        return $cat->name; // ...o qualsiasi altro attributo/elaborazione desideri
    }
}
return ''; // Questo proveniva da uno shortcode; modifica il valore di ritorno a piacere
5 dic 2018 20:04:32
0

Se può essere utile a qualcuno... per ottenere la categoria figlia o genitore, a seconda del 0 o 1 che inserisci nella $category

$category = get_the_category();
$parent = get_cat_name( $category[0]->category_parent );
if( ! function_exists('get_cat_slug') )
{
    function get_cat_slug($cat_id) {
        $cat_id = (int) $cat_id;
        $category = &get_category($cat_id);
        return $category->slug;
    }
}
if ( !empty($parent) ) {
    $output .= '<H2>' . esc_html( $category[1]->name ) . '</H2>';                               
} else {
    $output .= '<H2>' . esc_html( $category[0]->name ) . '</H2';
}
22 mar 2019 12:51:49
0

Puoi semplificarlo in questo modo:

  $category   = get_the_category();
  $cat_parent = $category[0]->category_parent;
  $category   = $cat_parent != 0 ? get_term($cat_parent, 'category')->slug : $category[0]->slug;
11 giu 2019 10:46:33
0

La seguente funzione è adattata per restituire la categoria radice:

function get_root_category($category = null) {
  if (!$category) $category = get_the_category()[0];
  $ancestors = get_ancestors($category->term_id, 'category');
  if (empty($ancestors)) return $category;
  $root = get_category(array_pop($ancestors)); 
  return $root;
}

Utilizzo: get_root_category()->slug

21 gen 2020 18:31:18
1

Tutte le risposte sopra sono valide tranne per "category_parent" ora sostituito con "parent" dal 2018!

Nel 2021

$custom_tax = 'books_category'; // Tassonomia personalizzata

// Ottieni i termini dall'ID del post
$terms = get_the_terms( $post->ID, $custom_tax );
$parent_id = $terms[0]->parent;

if ($parent_id != 0){
    $parent = get_term( $parent_id, $custom_tax);
    echo $parent->slug;
}
6 ago 2021 12:53:40
Commenti

I nomi delle proprietà parent e category_parent dovrebbero essere intercambiabili poiché gli oggetti categoria vengono elaborati tramite la funzione _make_cat_compat(). Detto questo, hai ragione sul fatto che parent è la nuova proprietà canonica! Penso che sarebbe meglio aggiungere questa informazione come modifica alla risposta in questione piuttosto che creare una nuova risposta :)

bosco bosco
6 ago 2021 19:56:39
0

Per le Tassonomie nel 2021

$capitulos = get_the_terms( $post->ID, 'capitulos' );
if ($capitulos) {
foreach($capitulos as $capitulo) { if ($capitulo->parent == 0) 
echo '<a href="' . get_term_link($capitulo->term_id) . '">' . $capitulo->name . '</a> ';}
}
15 feb 2022 21:51:54