edward
  • 0
Новичок

Как получить родителей пользовательской таксономии, как это делает get_category_parents()?

  • 0

У меня есть пользовательская таксономия «категория портфолио», в то время как мне нужно показать все категории иерархии публикации портфолио, например

сообщение находится под topcat -> childcat -> yetchildcat, я хочу показать «topcat, childcat, Yetchildcat» на странице сообщения, но get_the_terms only вернуть « yetchildcat », как мне получить все?

Share
  1. Есть более общая функция: она вызывается get_ancestors() и находится вwp-includes/taxonomy.php

    • 0
  2. @Джефф,

    Спасибо за это. Я исправил вашу неработающую функцию $link. и изменил значения по умолчанию, включив «Â» в качестве разделителя.

    // my own function to wo what get_category_parents does for other taxonomies
    function get_taxonomy_parents($id, $taxonomy, $link = true, $separator = ' » ', $nicename = false, $visited = array()) {
    
    $chain = '';
    
    $parent = &get_term($id, $taxonomy);
    
    if (is_wp_error($parent)) { echo "fail";
        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_taxonomy_parents($parent -> parent, $taxonomy, $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;
            $chain .= '<a href="' . esc_url( get_term_link( (int) $parent->term_id, $taxonomy ) ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . '">'.$name.'</a>' . $separator;
        } else {
            $chain .= $name.$separator;
        }
        return $chain;
    
    }
    
    • 0
  3. В get_category_parents() (см. источник ) нет функции более глубокого уровня. Он просто проверяет parent поле в объекте категории, а затем рекурсивно проверяет его родителя, пока оно не закончится.

    Так что вам нужно будет либо написать простой аналог, либо переписать его (в зависимости от того, какой функционал вам нужен).

    • 0
  4. get_the_terms и get_term получить идентификатор родителя среди данных термина. Таким образом, вы можете использовать эту информацию для создания пользовательских функций, которые будут отображать дерево таксономии.

    На самом деле я работаю над чем-то похожим — опубликую код, как только он заработает и почистится ;-D

    РЕДАКТИРОВАТЬ: я, наконец, сделал это… Вот код для получения «topcat -> childcat -> Yetchildcat» со ссылкой на страницу терминов таксономии:

    $terms = get_the_terms( $post->id, 'portfolio category' );
    if ( $terms && ! is_wp_error( $terms ) ) { 
        foreach ( $terms as $term ) {
            $tree = '<a href="'.get_term_link($term->slug, 'portfolio category').'">'.$term->name.'</a>';
            $parents = get_ancestors( $term->term_id, 'portfolio category' );
            foreach ($parents as $parent) {
                $term = get_term($parent, 'portfolio category');
                $tree = '<a href="'.get_term_link($term->slug, 'geo').'">'.$term->name.'</a> -> '.$tree;
           }
        echo $tree;
    }
    

    Я уверен, что можно сделать код лучше/чище, но, похоже, он работает ;-D

    • 0
  5. Я написал рекурсивную функцию, основанную почти точно на get_category_parents(), просто заменив части, относящиеся к категории, эквивалентами на основе терминов. Надеюсь, это поможет кому-то.

    // my own function to wo what get_category_parents does for other taxonomies
    function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {
    
    $chain = '';
    
    $parent = &get_term($id, $taxonomy);
    
    if (is_wp_error($parent)) { echo "fail";
        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_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);
    
    }
    
    if ( $link ) {
    
        $chain .= '<a href="' . esc_url( get_term_link( (int) $parent->term_id, $taxonomy ) ) . '" title="' . esc_attr( sprintf( __( "View all posts in %s" ), $parent->name ) ) . '">'.$name.'</a>' . $separator;
    } else {
        $chain .= $name.$separator;
    }
    return $chain;
    
    }
    
    • 0

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

You must login to add an answer.