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.

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

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.


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

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

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;

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.