Come Ottenere lo Slug della Categoria Genitore del Post Corrente
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.

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

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

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.

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/', ), );

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

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

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

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

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