Cara Mendapatkan Slug Kategori Induk dari Posting Saat Ini

12

Tema saya memiliki gaya berdasarkan kategori menggunakan kode berikut, yang menyisipkan siput kategori saat ini sebagai kelas CSS.

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

Sekarang saya akan menambahkan sejumlah besar sub-kategori baru, dan tampaknya konyol untuk menambahkan semuanya dalam CSS ketika saya seharusnya bisa memilih kategori induk dari posting saat ini dan menerapkan gaya untuk itu.

Saya bisa mendapatkan nama kategori induk:

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

Tapi spasi (dan kapitalisasi) adalah masalah ... Dan saya sepertinya tidak bisa mendapatkan siput kategori induk.

Saya tahu saya mungkin kehilangan langkah sederhana di suatu tempat, tetapi wawasan apa pun akan sangat dihargai.

DLR
sumber

Jawaban:

18

Anda harus menggunakan nilai ID yang dikembalikan oleh $category[0]->category_parentdan melewatinya get_term(). Contoh:

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

Anda perlu meminta data kategori induk. get_categorycukup banyak dibangun untuk melakukan itu.

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

Itu akan mengembalikan induk langsung dari kategori. Itu diberikan serangkaian kategori ini:

  • Kartun
    • Anjing
      • Scooby

Kode di atas akan mengembalikan "Dog" jika Anda memberikan ID untuk "Scooby". Jika Anda ingin kategori induk paling atas - "Kartun" - tidak peduli seberapa dalam sarangnya, gunakan sesuatu seperti ini:

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

Itu juga memiliki keuntungan penanganan kesalahan yang relatif rapi.

s_ha_dum
sumber
Terima kasih atas jawabannya, dan saya kemungkinan akan menggunakan cuplikan serupa di masa mendatang, tetapi juga melempar kesalahan jika memposting dalam kategori induk / kategori tanpa subkategori.
DLR
@ DLR: Ya, saya tahu. Saya harus pergi sebelum saya bisa menyelesaikan jawabannya. Saya sedang mengerjakan sesuatu yang lebih kompleks dan lebih kuat. Lihat hasil edit.
s_ha_dum
0

Saya suka jawaban sebelumnya dari @s_ha_dum, tetapi untuk mendapatkan kategori tingkat atas tanpa memperhatikan kedalaman, saya menggunakan apa yang saya anggap sebagai solusi yang lebih sederhana:

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

Jika itu dapat membantu seseorang ... untuk mendapatkan anak kucing atau orang tua, tergantung pada 0atau 1Anda memakai$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
sumber
0

Anda dapat menyederhanakannya seperti ini:

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

Fungsi berikut disesuaikan untuk mengembalikan kategori root :

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

Pemakaian: get_root_category()->slug

Zane Claes
sumber