맞춤 분류법 용어의 최상위 부모를 가져옵니다.


14

주어진 용어의 최상위 부모를 어떻게 얻습니까?

wp_get_object_terms게시물에서 분류 용어를 얻는 데 사용 하고 있지만 태그가 지정된 모든 용어를 표시하는 대신 태그가있는 용어의 최상위 부모 만 표시하고 싶습니다.

선택한 용어 인 경우 아침, 점심 및 저녁 만 표시하고 싶습니다.

x BREAKFAST
   x Cereal
   x Eggs
  LUNCH
     Hamburger
   x Pizza
  DINNER
     Fish
        Bass
      x Salmon
        Trout
     Lasagna

어떻게해야합니까?

답변:


22

Bainternet의 답변을 기반으로 한이 코드에 대한 Ivaylo에게 감사드립니다.

아래의 첫 번째 함수 get_term_top_most_parent는 용어와 분류법을 받아들이고 용어의 최상위 부모 (또는 부모가없는 경우 용어 자체)를 반환합니다. 두 번째 함수 ( get_top_parents)는 루프에서 작동하며 분류법에 따라 게시물 용어의 최상위 상위 HTML 목록을 반환합니다.

// Determine the top-most parent of a term
function get_term_top_most_parent( $term, $taxonomy ) {
    // Start from the current term
    $parent  = get_term( $term, $taxonomy );
    // Climb up the hierarchy until we reach a term with parent = '0'
    while ( $parent->parent != '0' ) {
        $term_id = $parent->parent;
        $parent  = get_term( $term_id, $taxonomy);
    }
    return $parent;
}

위 함수가 있으면 반환 된 결과를 반복하여 wp_get_object_terms각 용어의 상위 상위를 표시 할 수 있습니다 .

function get_top_parents( $taxonomy ) {
    // get terms for current post
    $terms = wp_get_object_terms( get_the_ID(), $taxonomy );
    $top_parent_terms = array();

    foreach ( $terms as $term ) {
        //get top level parent
        $top_parent = get_term_top_most_parent( $term, $taxonomy );
        //check if you have it in your array to only add it once
        if ( !in_array( $top_parent, $top_parent_terms ) ) {
            $top_parent_terms[] = $top_parent;
        }
    }

    // build output (the HTML is up to you)
    $output = '<ul>';
    foreach ( $top_parent_terms as $term ) {
          //Add every term
          $output .= '<li><a href="'. get_term_link( $term ) . '">' . $term->name . '</a></li>';
    }
    $output .= '</ul>';

    return $output;
}

최상위 용어를 인쇄하는 것이 아니라 최상위 부모 아래의 모든 용어를 계층 적으로 인쇄하는 수정 사항을보고 싶습니다.
Robert Andrews

@RobertAndrews 단일 용어의 하위 항목 만 필요한 경우 WordPress의 기본 제공 get_term_children( $term, $taxonomy )( documentation )을 사용할 수 있습니다 . 주어진 용어의 최상위 부모의 모든 자녀를 얻으려면 다음과 같이 위의 결과를 전달할 수 있습니다 get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).
supertrue

이 경우 $ term은 무엇입니까? 객체, 용어의 이름, 접두사 taxonomyname_number? 모든 경우에이 방법은로드하는 데 시간이 오래 걸립니다. 페이지가 몇 분 동안로드되기를 기다리고 있습니다.
Robert Andrews

1
원래 작성된 것처럼 ID가 필요했지만 용어 ID 또는 WP_Term 객체를 허용하도록 답변을 편집했습니다. 이 코드에서 문제를보고하는 유일한 사람아닙니다. 이상적으로 WP의 내장 get_ancestors함수 를 사용하도록 다시 작성해야합니다.이 기능은 새롭고 답변을 작성할 때 잘 문서화되지 않았습니다. 테스트 할 시간이되면 새로운 답변을 게시 할 것입니다.
supertrue

21

3.1.0부터 get_ancestors()사용 가능합니다. 계층 구조에서 상위에서 상위까지 상위 배열을 리턴합니다.


1
이것이 제 의견으로는 정답입니다.
numediaweb

1
이것이 가장 좋은 대답입니다.
Mark

8

다음은 주어진 용어의 최상위 모항을 얻는 간단한 함수입니다.

function get_term_top_most_parent( $term_id, $taxonomy ) {
    $parent  = get_term_by( 'id', $term_id, $taxonomy );
    while ( $parent->parent != 0 ){
        $parent  = get_term_by( 'id', $parent->parent, $taxonomy );
    }
    return $parent;
}

이 함수가 있으면 다음에서 반환 한 결과를 반복 할 수 있습니다 wp_get_object_terms.

$terms =  wp_get_object_terms( $post->ID, 'taxonomy' );
$top_parent_terms = array();
foreach ( $terms as $term ) {

    //Get top level parent
    $top_parent = get_term_top_most_parent( $term->ID, 'taxomony' );

    //Check if you have it in your array to only add it once
    if ( !in_array( $top_parent->ID, $top_parent_terms ) ) {
        $top_parent_terms[] = $top_parent;
    }
}

감사! 나는 이것을 지금 시도하고있다. 참고로 함수의 첫 번째 줄에 가까운 paren이 누락 된 것 같습니다.
supertrue

$ top_parent에서 $ taxonomy를 두 번째 매개 변수로 추가해야합니까?
supertrue

$ taxonomy 매개 변수를 추가했지만이 코드를 사용할 때 오류가 발생합니다. gist.github.com/1122631
supertrue

그래 나는 대답을 업데이트했다.
Bainternet

1
당신의 함수는 foreach 루프가 겹치는 것처럼 보입니다. pastebin.com/u48dxzap 그리고 여전히 오류가 발생하면 모든 코드를 붙여
넣고

5
/**
 * Get top level term
 */
function get_top_level_term($term,$taxonomy){
    if($term->parent==0) return $term;
    $parent = get_term( $term->parent,$taxonomy);
    return get_top_level_term( $parent , $taxonomy );
}

1
코드와 함께 설명을 추가하십시오.
s_ha_dum

4

나는 같은 문제가 있었고 쉽게 해결했다. 이것 좀 봐:

정의하십시오 $taxonomy. 데이터를 얻으려는 분류의 슬러그 일 수 있습니다. 이 작업을 수행 한 후 간단히 다음을 수행 할 수 있습니다.

<?php
    $postterms = wp_get_post_terms($post->ID, $taxonomy);   // get post terms
    $parentId = $postterms[0]->parent;                      // get parent term ID
    $parentObj = get_term_by('id', $parentId, $taxonomy);   // get parent object 
?>

이제 다음과 같은 것을 얻었습니다.

object(stdClass)#98 (11) {
  ["term_id"]=>
  int(3)
  ["name"]=>
  string(8) "Esportes"
  ["slug"]=>
  string(8) "esportes"
  ["term_group"]=>
  int(0)
  ["term_taxonomy_id"]=>
  int(3)
  ["taxonomy"]=>
  string(17) "noticiaseditorias"
  ["description"]=>
  string(0) ""
  ["parent"]=>
  int(0)
  ["count"]=>
  int(4)
  ["object_id"]=>
  int(123)
  ["filter"]=>
  string(3) "raw"
}

그리고 당신은 $parentObj슬러그, 이름, 아이디 등을 얻을 수 있습니다 . 그냥 사용하여 $parentObj->slug또는 $parentObj->nameexemple있다.


2

가장 쉬운 방법:

$rootId = end( get_ancestors( $term_id, 'my_taxonomy' ) );
$root = get_term( $rootId, 'my_taxonomy' );
echo $root->name;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.