Dapatkan orang tua tingkat atas dari istilah taksonomi khusus

14

Bagaimana saya bisa mendapatkan orang tua tingkat atas dari istilah yang diberikan?

Saya menggunakan wp_get_object_termsuntuk mendapatkan istilah taksonomi pada posting, tetapi alih-alih menunjukkan semua istilah yang ditandai, saya hanya ingin menunjukkan kepada orang tua tingkat atas istilah yang ditandai.

Jadi, jika ini adalah persyaratan yang saya pilih, saya hanya ingin menunjukkan Sarapan, Makan Siang, dan Makan Malam.

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

Bagaimana saya bisa melakukan ini?

supertrue
sumber

Jawaban:

22

Terima kasih kepada Ivaylo untuk kode ini, yang didasarkan pada jawaban Bainternet.

Fungsi pertama di bawah ini,, get_term_top_most_parentmenerima istilah dan taksonomi dan mengembalikan orang tua tingkat atas istilah (atau istilah itu sendiri, jika itu tanpa orangtua); fungsi kedua ( get_top_parents) bekerja di loop, dan, diberi taksonomi, mengembalikan daftar HTML dari orang tua tingkat atas dari persyaratan posting.

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

Setelah Anda memiliki fungsi di atas, Anda dapat mengulang hasil yang dikembalikan oleh wp_get_object_termsdan menampilkan orang tua teratas setiap istilah:

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;
}
supertrue
sumber
Saya ingin melihat modifikasi yang tidak hanya mencetak persyaratan tingkat atas tetapi, lebih tepatnya, semua persyaratan di bawah orangtua paling atas, secara hierarkis.
Robert Andrews
@RobertAndrews Jika Anda hanya perlu anak-anak dari satu masa, Anda dapat menggunakan WordPress get_term_children( $term, $taxonomy )( dokumentasi ) bawaan . Jika Anda ingin mendapatkan semua anak dari orang tua tingkat atas istilah yang diberikan, Anda bisa lulus hasil di atas ke dalamnya, seperti ini: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).
supertrue
Apa $ istilah dalam kasus ini, yaitu. objek, nama istilah, awalan taxonomyname_number? Dalam semua kasus, metode ini sangat panjang untuk dimuat. Saya sudah menunggu halaman dimuat selama beberapa menit sekarang.
Robert Andrews
1
Seperti yang awalnya ditulis itu mengharapkan ID, tapi saya mengedit jawaban untuk mengizinkan ID istilah atau objek WP_Term. Anda bukan satu-satunya yang melaporkan masalah dengan kode ini — idealnya harus ditulis ulang untuk menggunakan get_ancestorsfungsi bawaan WP , yang baru dan tidak didokumentasikan dengan baik ketika jawabannya ditulis. Saya akan memposting jawaban baru ketika saya punya waktu untuk menguji.
supertrue
21

Sejak 3.1.0, get_ancestors()tersedia. Ini mengembalikan berbagai leluhur dari terendah ke tertinggi dalam hierarki.

markd
sumber
1
Ini jawaban yang benar menurut saya.
numediaweb
1
Ini jawaban terbaik.
Tandai
8

Berikut adalah fungsi sederhana yang akan membuat Anda mendapatkan istilah induk paling banyak dari istilah apa pun yang diberikan:

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

Setelah Anda memiliki fungsi ini, Anda bisa mengulang hasil yang dikembalikan oleh 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;
    }
}
Bainternet
sumber
Terima kasih! Saya mencoba ini sekarang. FYI Saya pikir Anda kehilangan paren dekat di baris 1 dari fungsi.
supertrue
saya perlu menambahkan $ taksonomi sebagai parameter kedua di $ top_parent?
supertrue
Saya menambahkan parameter $ taksonomi tetapi saya mendapatkan kesalahan ketika saya menggunakan kode ini, di sini: gist.github.com/1122631
supertrue
ya kamu lakukan. saya memperbarui jawabannya.
Bainternet
1
fungsi Anda tampaknya rusak loop foreach Anda tumpang tindih coba ini: pastebin.com/u48dxzap dan jika Anda masih mendapatkan kesalahan tempel semua kode Anda dan saya akan memeriksa
Bainternet
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 );
}
Kiet
sumber
1
Harap tambahkan penjelasan beserta kode Anda.
s_ha_dum
4

Saya memiliki masalah yang sama dan saya menyelesaikannya dengan mudah. Lihat ini:

Tentukan $taxonomy. Ini bisa menjadi siput dari taksonomi yang Anda inginkan untuk mendapatkan data. Setelah melakukan ini, Anda cukup melakukan ini:

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

Sekarang Anda punya sesuatu seperti ini:

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

Dan Anda dapat menggunakan $parentObjuntuk mendapatkan siput, nama, id, apa pun. Hanya dengan menggunakan $parentObj->slugatau $parentObj->namesebagai contoh.

pengguna3328615
sumber
2

Cara termudah:

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