Como obter o Slug de categoria pai da postagem atual

11

Meu tema tem estilo por categoria usando o código a seguir, que insere o slug da categoria atual como uma classe CSS.

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

Agora estou prestes a adicionar um grande número de novas subcategorias, e parece bobagem adicioná-las todas em CSS quando eu puder selecionar a categoria pai da postagem atual e aplicar estilos a ela.

Consegui obter o nome da categoria principal:

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

Mas os espaços (e a capitalização) são um problema ... E parece que não consigo pegar o slug da categoria principal.

Eu sei que provavelmente estou perdendo um simples passo em algum lugar, mas qualquer insight seria muito apreciado.

    
por DLR 25.01.2014 / 22:40

3 respostas

15

Você precisará usar o valor de ID retornado por $category[0]->category_parent e passá-lo por get_term() . Exemplo:

$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;
}
    
por Rachel Baker 25.01.2014 / 23:28
5

Você precisará consultar os dados da categoria pai. get_category é praticamente construído para isso.

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

Isso retornará o pai imediato da categoria. Isso é dado a este conjunto de categorias:

  • Cartoon
    • cão
      • Scooby

O código acima retornará "Dog" se você fornecer o ID para "Scooby". Se você quiser a categoria pai mais importante - "Cartoon" - não importa o quão profundo seja o aninhamento, use algo assim:

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

Isso também tem a vantagem do tratamento de erros relativamente puro.

    
por s_ha_dum 25.01.2014 / 23:22
0

Gosto da resposta anterior de @s_ha_dum, mas para obter a categoria de nível superior, independentemente da profundidade, usei o que considero ser uma solução mais simples:

$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
    
por scott8035 05.12.2018 / 19:04