Cum să obții slug-ul categoriei părinte a postării curente în WordPress

25 ian. 2014, 23:40:08
Vizualizări: 92.2K
Voturi: 16

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ă.

0
Toate răspunsurile la întrebare 9
0
26

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;
}
26 ian. 2014 00:28:52
2

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

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.

26 ian. 2014 00:22:07
Comentarii

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 DLR
26 ian. 2014 02:10:03

@DLR: Da, știu. A trebuit să plec înainte să pot finaliza răspunsul. Lucram la ceva mai complex și mai robust. Vezi editarea.

s_ha_dum s_ha_dum
26 ian. 2014 02:30:13
0

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/',
  ),
);

9 mai 2023 05:02:19
0

Î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
5 dec. 2018 20:04:32
0

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';
}
22 mar. 2019 12:51:49
0

Puteți simplifica astfel:

  $category   = get_the_category();
  $cat_parent = $category[0]->category_parent;
  $category   = $cat_parent != 0 ? get_term($cat_parent, 'category')->slug : $category[0]->slug;
11 iun. 2019 10:46:33
0

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

21 ian. 2020 18:31:18
1

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;
}
6 aug. 2021 12:53:40
Comentarii

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 bosco
6 aug. 2021 19:56:39
0

Pentru Taxonomii în 2021

$capitulos = get_the_terms( $post->ID, 'capitulos' );
if ($capitulos) {
foreach($capitulos as $capitulo) { if ($capitulo->parent == 0) 
echo '<a href="' . get_term_link($capitulo->term_id) . '">' . $capitulo->name . '</a> ';}
}
15 feb. 2022 21:51:54