Cum să obții slug-ul categoriei părinte a postării curente în WordPress
Tema mea are stilizare pe categorii folosind următorul cod, care inserează slug-ul categoriei curente ca clasă CSS.
<div class="CategorySpecificStyle
<?php $category = get_the_category(); echo $category[0]->slug; ?>">
<?php echo $category[0]->cat_name; ?>
</div>
Acum urmează să adaug un număr mare de sub-categorii și pare inutil să le adaug pe toate în CSS când ar trebui să pot selecta doar categoria părinte a postării curente și să aplic stilurile acesteia.
Am reușit să obțin numele categoriei părinte:
$parentcat = get_cat_name($category[0]->category_parent);
Dar spațiile (și capitalizarea) reprezintă o problemă... Și nu reușesc să obțin slug-ul categoriei părinte.
Știu că probabil omit un pas simplu undeva, dar orice sugestie ar fi apreciată.

Va trebui să utilizați valoarea ID returnată de $category[0]->category_parent
și să o transmiteți prin funcția get_term()
. Exemplu:
$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;
}

Va trebui să interogați pentru datele categoriei părinte. Funcția get_category
este creată special pentru aceasta.
$category = get_the_category();
$parent = get_category($category[0]->category_parent);
echo $parent->slug;
Acest cod va returna părintele direct al categoriei. De exemplu, având următoarea structură de categorii:
- Desene animate
- Câine
- Scooby
- Câine
Codul de mai sus va returna "Câine" dacă îi este dat ID-ul pentru "Scooby". Dacă doriți categoria părinte de nivel superior - "Desene animate" - indiferent de cât de adânc este imbricată, folosiți ceva de genul:
$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();
}
Acest cod are și avantajul unei gestionări relativ elegante a erorilor.

Mulțumesc pentru răspuns și probabil voi folosi un fragment similar în viitor, dar acesta aruncă și erori dacă postul se află într-o categorie părinte / categorie fără subcategorii.

Am constatat că majoritatea soluțiilor de mai sus nu funcționează pentru Tipuri de Postare Personalizate. Așadar, am scris următoarea funcție.
Dat fiind ID-ul categoriei curente (copil), aceasta parcurge lanțul până la vârf pentru a obține părinții categoriei. Returnează un array care conține URL-ul, numele, slug-ul și ID-ul părinților.
/** * @param $category_id * * @return array Returnează fie un array gol dacă nu există părinți, fie * un array de categorii de la categoria de bază[0] până la categoria părinte * Array-ul conține sub-array-uri cu ['id'] ['name'] ['slug'] ['url'] * */ function get_category_parent_array( $category_id, $category_taxonomy = 'category'){ $category_id = abs((int)$category_id); $category_taxonomy = sanitize_key( $category_taxonomy); // Verificare pentru părintele de top - ( id = 0 ) if( 0 == $category_id ){ return array(); } $child_category = get_term( $category_id, $category_taxonomy); if( empty($child_category)){ return array(); } $parent_category_id = $child_category->parent; if( 0 == $parent_category_id ){ return array(); // Nu putem obține categoria 0. } // Am verificat dacă parent_id este 0, dar dublăm verificarea aici pentru alte probleme care ar putea cauza un părinte gol $parent_category = get_term( $parent_category_id, $category_taxonomy); if ( empty ( $parent_category ) ){ return array(); } // Pregătim array-ul de returnat $parent_array = array(); $parent_array['id'] = $parent_category_id; $parent_array['slug'] = esc_attr($parent_category->slug); $parent_array['name'] = esc_attr($parent_category->name); $parent_array['url'] = esc_url(get_term_link( $parent_category)); if ( 0 == $parent_category_id ){ return $parent_array; }else{ $new_parent = get_category_parent_array($parent_category_id, $category_taxonomy ); if(! empty( $new_parent ) ){ return array( $new_parent, $parent_array); }else{ return $parent_array; } } }
De exemplu. Într-o ierarhie de genul Acasă>Produse>Pungi-Plastice>Pungi-Polietilenă>Pungi-3mu Unde categoria copil / curentă este Pungi-3mu, funcția a returnat următoarele:
array ( 0 => array ( 'id' => 260, 'slug' => 'plastic-bags', 'name' => 'Pungi Plastice', 'url' => 'https://example.com/product_category/plastic-bags/', ), 1 => array ( 'id' => 261, 'slug' => 'polybags', 'name' => 'Pungi Polietilenă', 'url' => 'https://exmapl.com/product_category/polybags/', ), );

Îmi place răspunsul anterior de la @s_ha_dum, dar pentru a obține categoria de nivel superior indiferent de adâncime, am folosit ceea ce consider a fi o soluție mai simplă:
$cats = get_the_category();
foreach ( $cats as $cat ) {
if ( $cat->category_parent == 0 ) {
return $cat->name; // ...sau orice alt atribut/procesare doriți
}
}
return ''; // Acesta a fost dintr-un shortcode; ajustați valoarea returnată după preferințe

Dacă poate ajuta pe cineva... pentru a obține categoria copil sau părinte, în funcție de 0
sau 1
pe care îl puneți în $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';
}

Următoarea funcție este adaptată pentru a returna categoria rădăcină:
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;
}
Utilizare:
get_root_category()->slug

Toate răspunsurile de mai sus sunt bune, cu excepția faptului că "category_parent" a fost înlocuit cu "parent" din 2018!
În 2021
$custom_tax = 'books_category'; //Taxonomie personalizată
//Obține termenii din ID-ul postării
$terms = get_the_terms( $post->ID, $custom_tax );
$parent_id = $terms[0]->parent;
if ($parent_id != 0){
$parent = get_term( $parent_id, $custom_tax);
echo $parent->slug;
}

Numele de proprietăți parent
și category_parent
ar trebui să fie interschimbabile, deoarece obiectele de categorie sunt procesate prin funcția _make_cat_compat()
. Cu toate acestea, ai dreptate că parent
este noua proprietate canonică! Cred că ar fi mai potrivit să adaugi acest lucru ca o editare la răspunsul existent decât ca un răspuns complet nou :)
