Как проверить, какая категория уровней для WordPress? - PullRequest
1 голос
/ 10 февраля 2012

Позвольте мне рассказать вам сценарий, сначала скажем, что структура категорий в WordPress выглядит следующим образом

Level 1: Top
Level 2: -Nextme_1
Level 3: --Nextme_2
         --Nextme_3
Level 4: ---Nextme_4
         ---Nextme_5

Теперь мне нужно проверить, каков уровень категории?Скажем, я ловлю категорию уровня 3, поэтому мне нужно использовать другой шаблон, а если его уровень 4. Тогда мне нужно использовать другой шаблон?

Кто-нибудь может дать мне подсказку?

Спасибо
Рахул

Ответы [ 4 ]

5 голосов
/ 10 февраля 2012

Если у вас мало категорий, вы можете попробовать отредактировать их слаг от администратора, а затем на своей странице вы получите слаг категории таким образом:

if (is_category()) {
    $cat = get_query_var('cat');
    $category = get_category($cat);
    echo 'your slug is '. $category->slug;
}

Теперь, когда вы редактируете слагов категорий, попробуйте назвать их после их уровня: cat-lvl-1, cat-lvl-2. Затем на своей странице вы извлекаете число из категории slug, используя некоторую строковую функцию php, а затем проверяете это число:

if ($category->slug == 1 ) {
//load the template for the category of level 1
}
 if ($category->slug == 2 ) {
    //load the template for the category of level 2
    }

и т. Д.

Позже редактировать: Попробуйте это:

function get_level($category, $level = 0)
{
    if ($category->category_parent == 0) {
        return $level;
    } else {
        $level++;
        $category = get_category($category->category_parent);
        get_level($category, $level);
    }

}

if (is_category()) {
    $cat = get_query_var('cat');
    $yourcat = get_category($cat);

    echo get_level($yourcat);
}
2 голосов
/ 11 февраля 2012

Спасибо большое.Это превосходно с небольшим изменением написанного вами кода, это хорошо, но он не возвращает никакого значения (т. Е. $ Level), хотя его вычисления верны.Незначительное изменение, которое я сделал, и теперь оно отлично работает с небольшим редактированием вашего кода, приведенного ниже ..

`

function get_level($category, $level = 0)
{
    if ($category->category_parent == 0) {
        return $level;
    } else {
        $level++;
        $category = get_category($category->category_parent);
        return get_level($category, $level);
    }

}

if (is_category()) {
    $cat = get_query_var('cat');
    $yourcat = get_category($cat);

    echo get_level($yourcat);
}

`

Спасибо @ zuzuleinen

0 голосов
/ 08 февраля 2017

Вы можете вызвать функцию get_ancestors () , чтобы получить an array containing the parents of the given object. Тогда вам нужно для подсчета элементов в результате.

function get_the_level($id, $type = 'category') {
  return count( get_ancestors($id, $type) );
}

if( is_category() ) {
  $level = get_the_level( $cat );
} 
elseif( is_product_category() ) {
  $level = get_the_level( $wp_query->get_queried_object()->term_id, 'product_cat' );
}
0 голосов
/ 06 июля 2014

Я посетил эту страницу несколько месяцев назад. Я вернулся сегодня, стрелка вверх на вышеупомянутом решении тогда все еще копал. Хотя это хорошее решение, Wordpress часто предлагает лучшее или близкое решение.

get_category_parents ()

Эта функция работает так, как Рахул напечатал в основном. Это также называет себя, что кажется наиболее логичным подходом, и именно поэтому Рахул получает от меня точку зрения по этому вопросу. Не используйте $ link, возвращайте строку категорий, анализируйте их (), затем подсчитывайте, или, я полагаю, мы могли бы подсчитать, сколько раз использовался разделитель, и добавить 1 *.

function get_category_parents( $id, $link = false, $separator = '/', $nicename = false, $visited = array() ) {
   $chain = '';
$parent = get_term( $id, 'category' );
if ( is_wp_error( $parent ) )
    return $parent;

if ( $nicename )
    $name = $parent->slug;
else
    $name = $parent->name;

if ( $parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited ) ) {
    $visited[] = $parent->parent;
    $chain .= get_category_parents( $parent->parent, $link, $separator, $nicename, $visited );
}

if ( $link )
    $chain .= '<a href="' . esc_url( get_category_link( $parent->term_id ) ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . '">'.$name.'</a>' . $separator;
else
    $chain .= $name.$separator;
return $chain;

}

...