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.
DLR
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 :)
bosco