Jak zdobyć informacje o kategorii macierzystej bieżącego postu

12

Mój motyw ma stylizację według kategorii przy użyciu następującego kodu, który wstawia ślimak bieżącej kategorii jako klasę CSS.

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

Teraz zamierzam dodać dużą liczbę nowych podkategorii i wydaje się głupie dodawanie ich wszystkich w CSS, kiedy powinienem być w stanie po prostu wybrać kategorię nadrzędną bieżącego postu i zastosować do tego style.

Udało mi się uzyskać nazwę kategorii nadrzędnej:

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

Ale spacje (i wielkie litery) to problem ... I wydaje mi się, że nie dostaję ślimaka kategorii nadrzędnej.

Wiem, że prawdopodobnie brakuje mi gdzieś prostego kroku, ale każdy wgląd byłby bardzo mile widziany.

DLR
źródło

Odpowiedzi:

18

Musisz użyć wartości identyfikatora zwróconej przez $category[0]->category_parenti przekazać ją get_term(). Przykład:

$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;
}
Rachel Baker
źródło
5

Konieczne będzie zapytanie o dane kategorii nadrzędnej. get_categoryjest właściwie do tego stworzony.

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

Zwróci to bezpośredniego rodzica kategorii. Dano mu ten zestaw kategorii:

  • Kreskówka
    • Pies
      • Scooby

Powyższy kod zwróci „Dog”, jeśli podasz identyfikator „Scooby”. Jeśli chcesz najwyższą kategorię nadrzędną - „Cartoon” - bez względu na to, jak głęboko zagnieżdżenie, użyj czegoś takiego:

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

Ma to również tę zaletę, że stosunkowo dobrze obsługuje błędy.

s_ha_dum
źródło
Dzięki za odpowiedź, prawdopodobnie w przyszłości użyję podobnego fragmentu kodu, ale generuje on również błędy, jeśli wpis w kategorii / kategorii nadrzędnej nie zawiera podkategorii.
DLR
@DLR: Tak, wiem. Musiałem wyjść, zanim zdążyłem udzielić odpowiedzi. Pracowałem nad czymś bardziej złożonym i solidniejszym. Zobacz edycję.
s_ha_dum
0

Podoba mi się poprzednia odpowiedź z @s_ha_dum, ale aby uzyskać kategorię najwyższego poziomu niezależnie od głębokości, skorzystałem z tego, co uważam za prostsze rozwiązanie:

$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
scott8035
źródło
0

Jeśli to może pomóc komuś ... w zdobyciu dziecka kota lub rodzica, w zależności od tego, 0czy 1umieścisz$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';
}
TikTakTikTak
źródło
0

Możesz to uprościć w następujący sposób:

  $category   = get_the_category();
  $cat_parent = $category[0]->category_parent;
  $category   = $cat_parent != 0 ? get_term($cat_parent, 'category')->slug : $category[0]->slug;
Jafar Abazeed
źródło
0

Następująca funkcja jest przystosowana do zwracania kategorii głównej :

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

Stosowanie: get_root_category()->slug

Zane Claes
źródło