peroyomas
  • 0
Новичок

Отображать только самую глубокую категорию в одном сообщении?

  • 0

Я хочу отобразить прямого предка категории данного сообщения. Наглядный пример:

Вот категории, которые у меня есть:

  • Кат1
  • Кат2
    • Категория 2.1
      • Категория 2.1.1
      • Категория 2.1.2
    • Кат2.2
      • Категория 2.2.1
      • Категория 2.2.2.
    • Кат2.3
  • Кат3
  • Кат4

Я помещаю сообщения только в одну категорию между одним и тем же «уровнем», но когда в категории больше подкатегорий, я проверяю весь трейлинг, например:

  • Кат1
  • [Х] Категория 2
    • [Х] Категория 2.1
      • Категория 2.1.1
      • [Х] Категория 2.1.2
    • Кат2.2
      • Категория 2.2.1
      • Категория 2.2.2.
    • Кат2.3
  • Кат3
  • Кат4

Теперь на странице с одним сообщением я хочу отобразить имя прямого предка категории сообщения (в данном случае Cat2.1.2). По умолчанию я просто использую get_the_category(), но вместо этого показывает категорию верхнего уровня (в данном случае Cat2). Я пока не рассматриваю возможность снять отметку с верхних уровней, потому что это вызовет другие проблемы в шаблоне.

Share
  1. Я пришел к этому сообщению, поскольку я искал код. Но отмеченный ответ больше не работает для меня. Я написал функцию, чтобы получить категорию самого глубокого уровня, назначенную сообщению.

    function post_deepest_level_cat($post_categories) {
        foreach ($post_categories as $category) {
            $cat_ids[] = $category->term_id;
        }   
        $tree_args = array(
            'current_category' => $cat_ids,
            'depth'             => 50,
            'hierarchical'     => true,
            'echo' => 0,
            );                  
                    
        $category_list = wp_list_categories($tree_args);                
        $dom = new DOMDocument;
        @$dom->loadHTML($category_list);
        $links = $dom->getElementsByTagName('a');
        $new_cat_array = array();
        foreach ($links as $link) { 
            $menu = get_term_by('name', $link->nodeValue, 'category');
            if (in_array($menu->term_id, $cat_ids)) {
                $deepest_cat_id = $menu->term_id;
            }                   
        }           
        return $deepest_cat_id;
    }
    

    И использовать приведенную выше функцию здесь является примером.

    $post_categories = wp_get_post_terms(10, 'category'); //All categories assigned to this post id "10"
    $deeper_cat_id = post_deepest_level_cat($post_categories );
    echo $deeper_cat_id; // will echo the id of deepest and last category of the current post.
    

    Это поможет в 2020 году. Если у вас есть лучший код, дайте мне знать. Спасибо

    • 0
  2. Возможно, get_the_category() это всегда будет возвращать категории в правильном порядке (с самой глубокой в ​​конце), но если это не так, вы также можете перебрать все категории и удалить те, на которые указывает другая категория, как на их родителя.

    $post_categories = get_the_category();
    $categories_by_id = array();
    foreach ( $post_categories as $category ) {
        $categories_by_id[$category->cat_ID] = $category;
    }
    foreach ( $post_categories as $category ) {
        unset( $categories_by_id[$category->category_parent] );
    }
    // $categories_by_id will now only contain the deepest categories
    
    • 0
  3. Ну, я думаю, я нашел, как (не полностью проверено):

    <?php
    $category = get_the_category($post->ID);
    echo end($category)->cat_name;
    ?>
    

    По сути, он возвращает имя последней категории из массива категорий, заданного get_the_category .

    • 0

Оставить ответ

You must login to add an answer.