Cómo obtener la babosa de categoría principal de la publicación actual

12

Mi tema tiene un estilo por categoría utilizando el siguiente código, que inserta la babosa de la categoría actual como una clase CSS.

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

Ahora estoy a punto de agregar una gran cantidad de nuevas subcategorías, y parece una tontería agregarlas todas en CSS cuando debería poder seleccionar la categoría principal de la publicación actual y aplicar estilos a eso.

He podido obtener el nombre de la categoría principal:

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

Pero los espacios (y las mayúsculas) son un problema ... Y parece que no puedo obtener la babosa de la categoría principal.

Sé que probablemente me estoy perdiendo un paso simple en alguna parte, pero cualquier idea sería muy apreciada.

DLR
fuente

Respuestas:

18

Deberá usar el valor de ID devuelto por $category[0]->category_parenty pasarlo get_term(). Ejemplo:

$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
fuente
5

Deberá consultar los datos de la categoría principal. get_categoryestá más o menos construido para hacer eso.

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

Eso devolverá al padre inmediato de la categoría. A eso se le da este conjunto de categorías:

  • Dibujos animados
    • Perro
      • Scooby

El código anterior devolverá "Perro" si le da la identificación de "Scooby". Si desea la categoría principal superior - "Caricatura" - no importa qué tan profunda sea la anidación, use algo como esto:

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

Eso también tiene la ventaja de manejar relativamente bien los errores.

s_ha_dum
fuente
Gracias por la respuesta, y probablemente usaré un fragmento similar en el futuro, pero también arroja errores si la publicación en una categoría / categoría principal sin subcategorías.
DLR
@DLR: Sí, lo sé. Tuve que irme antes de poder completar la respuesta. Estaba trabajando en algo más complejo y más robusto. Ver la edición.
s_ha_dum
0

Me gusta la respuesta anterior de @s_ha_dum, pero para obtener la categoría de nivel superior independientemente de la profundidad, utilicé lo que considero una solución más simple:

$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
fuente
0

Si se puede ayudar a alguien ... para conseguir gato hijo o padre, dependiendo de la 0o 1le pondrá en el$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
fuente
0

Puedes simplificarlo así:

  $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
fuente
0

La siguiente función está adaptada para devolver la categoría raíz :

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

Zane Claes
fuente