Как получить слаг для родительской категории текущего поста

12

Моя тема имеет стилизацию по категориям с использованием следующего кода, который вставляет фрагмент текущей категории как класс CSS.

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

Теперь я собираюсь добавить большое количество новых подкатегорий, и кажется глупым добавлять их все в CSS, когда я смогу просто выбрать родительскую категорию текущего поста и применить к ней стили.

Мне удалось получить имя родительской категории:

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

Но пробелы (и заглавные буквы) - это проблема ... И я не могу получить пулю родительской категории.

Я знаю, что, возможно, где-то пропущен простой шаг, но любая идея будет принята с благодарностью.

DLR
источник

Ответы:

18

Вам нужно будет использовать возвращаемое значение ID $category[0]->category_parentи передать его до конца get_term(). Пример:

$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

Вам нужно будет запросить данные родительской категории. get_categoryв значительной степени построен для этого.

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

Это вернет непосредственного родителя категории. Вот и дан этот набор категорий:

  • Мультфильм
    • Собака
      • Scooby

Приведенный выше код вернет «Dog», если вы дадите ему идентификатор «Scooby». Если вы хотите самую верхнюю родительскую категорию - «Мультфильм» - независимо от глубины вложения, используйте что-то вроде этого:

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

Это также имеет преимущество относительно аккуратной обработки ошибок.

s_ha_dum
источник
Спасибо за ответ, и я, вероятно, буду использовать подобный фрагмент в будущем, но он также выдает ошибки, если публикация в родительской категории / категории без подкатегорий.
DLR
@DLR: Да, я знаю. Мне пришлось уйти, прежде чем я смог завершить ответ. Я работал над чем-то более сложным и надежным. Смотрите редактирование.
s_ha_dum
0

Мне нравится предыдущий ответ от @s_ha_dum, но для получения категории верхнего уровня независимо от глубины я использовал то, что считаю более простым решением:

$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
источник
0

Если это может помочь кому-то ... получить ребенка кота или родителя, в зависимости от того, 0или 1вы надеваете$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
источник
0

Вы можете упростить это так:

  $category   = get_the_category();
  $cat_parent = $category[0]->category_parent;
  $category   = $cat_parent != 0 ? get_term($cat_parent, 'category')->slug : $category[0]->slug;
Джафар Абазид
источник
0

Следующая функция адаптирована для возврата корневой категории:

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

Использование: get_root_category()->slug

Зейн Клас
источник