Come ottenere lo slug di categoria padre del post corrente


12

Il mio tema ha uno stile per categoria usando il seguente codice, che inserisce la lumaca 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> 

Ora sto per aggiungere un gran numero di nuove sottocategorie, e sembra sciocco aggiungerle tutte in CSS quando dovrei essere in grado di selezionare solo la categoria genitore del post corrente e applicare stili a quello.

Sono stato in grado di ottenere il nome della categoria padre:

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

Ma gli spazi (e le maiuscole) sono un problema ... E non riesco a ottenere la lumaca della categoria genitore.

So che probabilmente mi manca un semplice passo da qualche parte, ma qualsiasi intuizione sarebbe molto apprezzata.

Risposte:


18

Dovrai utilizzare il valore ID restituito da $category[0]->category_parente passarlo 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;
}

5

Sarà necessario eseguire una query per i dati della categoria padre. get_categoryè praticamente costruito per farlo.

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

Ciò restituirà il genitore immediato della categoria. Questo è dato questo insieme di categorie:

  • cartone animato
    • Cane
      • Scooby

Il codice sopra restituirà "Cane" se gli dai l'ID per "Scooby". Se vuoi la categoria genitore più in alto - "Cartoon" - non importa quanto in profondità il nesting, usa qualcosa del genere:

$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();
}

Ciò ha anche il vantaggio di una gestione degli errori relativamente accurata.


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

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

0

Mi piace la risposta precedente di @s_ha_dum, ma per ottenere la categoria di massimo livello 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; // ...or whatever other attribute/processing you want
    }
}
return ''; // This was from a shortcode; adjust the return value to taste

0

Se può aiutare qualcuno ... ad avere un gatto o un genitore figlio, a seconda di 0o 1hai messo su$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';
}

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;

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

Uso: get_root_category()->slug

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.