Nhận cha mẹ cấp cao nhất của một thuật ngữ phân loại tùy chỉnh


14

Làm thế nào tôi có thể có được cha mẹ cấp cao nhất của một thuật ngữ nhất định?

Tôi đang sử dụng wp_get_object_termsđể có được các điều khoản phân loại trên các bài đăng, nhưng thay vì hiển thị tất cả các điều khoản được gắn thẻ, tôi chỉ muốn hiển thị các phụ huynh cấp cao nhất được gắn thẻ.

Vì vậy, nếu đây là những điều khoản được lựa chọn của tôi, tôi chỉ muốn hiển thị Bữa sáng, Bữa trưa và Bữa tối.

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

Tôi có thể làm cái này như thế nào?

Câu trả lời:


22

Cảm ơn Ivaylo về mã này, dựa trên câu trả lời của BaiNET.

Hàm đầu tiên bên dưới, get_term_top_most_parentchấp nhận một thuật ngữ và phân loại và trả về cha mẹ cấp cao nhất của thuật ngữ (hoặc chính thuật ngữ đó, nếu nó không có cha mẹ); hàm thứ hai ( get_top_parents) hoạt động trong vòng lặp và, được đưa ra một nguyên tắc phân loại, trả về một danh sách HTML của các bậc cha mẹ cấp cao nhất của các điều khoản của bài đăng.

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

Khi bạn có chức năng trên, bạn có thể lặp lại các kết quả được trả về wp_get_object_termsvà hiển thị cha mẹ hàng đầu của mỗi thuật ngữ:

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

Tôi rất muốn thấy một sửa đổi sẽ không chỉ in ra các điều khoản cấp cao nhất, mà, thay vào đó, tất cả các điều khoản bên dưới bậc cha mẹ cao nhất, theo thứ bậc.
Robert Andrew

@RobertAndrews Nếu bạn chỉ cần con của một thuật ngữ duy nhất, bạn có thể sử dụng get_term_children( $term, $taxonomy )( tài liệu ) tích hợp sẵn của WordPress . Nếu bạn muốn có được tất cả con cái của một phụ huynh cấp cao nhất định, bạn có thể chuyển kết quả trên vào đó, như thế này : get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).
tối

$ Thuật ngữ trong trường hợp này là gì, tức là. đối tượng, tên của thuật ngữ, tiền tố taxonomyname_number? Trong mọi trường hợp, phương pháp này cực kỳ dài để tải. Tôi đã chờ đợi để tải trang trong vài phút.
Robert Andrew

1
Như đã viết ban đầu, nó mong đợi một ID, nhưng tôi đã chỉnh sửa câu trả lời để cho phép một đối tượng ID hoặc WP_Term hạn. Bạn không phải là người duy nhất báo cáo vấn đề với mã này, lý tưởng là nó nên được viết lại để sử dụng get_ancestorschức năng tích hợp sẵn của WP , mới và không được ghi chép tốt khi câu trả lời được viết. Tôi sẽ đăng một câu trả lời mới khi tôi có thời gian để kiểm tra.
tối

21

Kể từ 3.1.0, get_ancestors()có sẵn. Nó trả về một mảng của tổ tiên từ thấp nhất đến cao nhất trong hệ thống phân cấp.


1
Đây là câu trả lời đúng theo ý kiến ​​của tôi.
numediaweb

1
Đây là câu trả lời tốt nhất.
Đánh dấu

8

Đây là một chức năng đơn giản sẽ giúp bạn có được thuật ngữ cha mẹ hàng đầu của bất kỳ thuật ngữ nào:

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

Khi bạn có chức năng này, bạn có thể chỉ cần lặp lại các kết quả được trả về bởi 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;
    }
}

Cảm ơn! Tôi đang thử điều này ngay bây giờ. FYI Tôi nghĩ rằng bạn đang thiếu một paren gần trong dòng 1 của chức năng.
supertrue

Tôi có cần thêm $ taxonomy làm tham số thứ hai trong $ top_parent không?
supertrue

Tôi đã thêm tham số $ taxonomy nhưng gặp lỗi khi tôi sử dụng mã này, tại đây: gist.github.com/1122631
supertrue

vâng bạn làm tôi đã cập nhật câu trả lời
Bai Internet

1
chức năng của bạn dường như bị hỏng các vòng lặp foreach của bạn đang chồng chéo hãy thử điều này: pastebin.com/u48dxzap và nếu bạn vẫn gặp lỗi, hãy dán tất cả mã của bạn và tôi sẽ kiểm tra
Bai Internet

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
Vui lòng thêm một lời giải thích cùng với mã của bạn.
s_ha_dum

4

Tôi đã có cùng một vấn đề và tôi đã giải quyết dễ dàng. Kiểm tra này:

Xác định $taxonomy. Nó có thể là con sên của phân loại bạn muốn lấy dữ liệu. Sau khi làm điều này, bạn có thể chỉ cần làm điều này:

<?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 
?>

Bây giờ bạn đã có một cái gì đó như thế này:

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

Và bạn có thể sử dụng $parentObjđể có được slug, tên, id, bất cứ điều gì. Chỉ bằng cách sử dụng $parentObj->slughoặc $parentObj->namenhư mẫu mực.


2

Cách dễ nhất:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.