Como obter a categoria pai da publicação atual


12

Meu tema tem estilo por categoria, usando o código a seguir, que insere a lesma 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 pai:

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

Mas espaços (e letras maiúsculas) são um problema ... E eu não consigo entender a lesma da categoria pai.

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

Respostas:


18

Você precisará usar o valor de ID retornado $category[0]->category_parente transmiti-lo 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;
}

5

Você precisará consultar os dados da categoria pai. get_categoryé praticamente construído para fazer 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:

  • Desenho animado
    • Cão
      • Scooby

O código acima retornará "Dog" se você der o ID para "Scooby". Se você deseja a categoria pai mais alta - "Desenho animado" - não importa a profundidade do aninhamento, use algo como isto:

$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 de um tratamento de erros relativamente limpo.


Obrigado pela resposta, e provavelmente usarei um trecho semelhante no futuro, mas também gerará erros se a postagem em uma categoria / categoria pai sem subcategorias.
DLR

@ DLR: Sim, eu sei. Eu tive que sair antes que eu pudesse completar a resposta. Eu estava trabalhando em algo mais complexo e mais robusto. Veja a edição.
precisa saber é

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

0

Se ele pode ajudar alguém ... para obter gato filho ou pai, dependendo do 0ou 1você colocar na$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

Você pode simplificá-lo assim:

  $category   = get_the_category();
  $cat_parent = $category[0]->category_parent;
  $category   = $cat_parent != 0 ? get_term($cat_parent, 'category')->slug : $category[0]->slug;

0

A função a seguir é adaptada para retornar a categoria raiz :

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.