รับพาเรนต์ระดับบนสุดของคำศัพท์อนุกรมวิธานที่กำหนดเอง


14

ฉันจะรับผู้ปกครองระดับสูงของคำที่กำหนดได้อย่างไร

ฉันกำลังใช้wp_get_object_termsเพื่อรับข้อกำหนดด้านอนุกรมวิธานบนโพสต์ แต่แทนที่จะแสดงคำที่ติดแท็กทั้งหมดฉันต้องการแสดงเฉพาะผู้ปกครองระดับสูงของคำที่ติดแท็กเท่านั้น

ดังนั้นหากสิ่งเหล่านี้เป็นคำที่ฉันเลือกฉันต้องการแสดงเฉพาะอาหารเช้าอาหารกลางวันและอาหารเย็น

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

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


22

ขอบคุณ Ivaylo สำหรับรหัสนี้ซึ่งเป็นไปตามคำตอบของ Bainternet

ฟังก์ชันแรกด้านล่างget_term_top_most_parentยอมรับคำและอนุกรมวิธานและส่งคืนผู้ปกครองระดับสูงสุดของคำนั้น ๆ ฟังก์ชั่นที่สอง ( get_top_parents) ทำงานในลูปและรับ taxonomy ส่งคืนรายการ 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 )( เอกสาร ) ได้ หากคุณต้องการที่จะได้รับเด็กทุกคนที่เป็นของ บริษัท get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy )ใหญ่ระดับบนสุดระยะที่กำหนดคุณสามารถผ่านผลดังกล่าวข้างต้นเป็นมันเช่นนี้
supertrue

$ term ในกรณีนี้คืออะไร วัตถุชื่อของคำศัพท์ taxonomyname_number นำหน้า? ในทุกกรณีวิธีนี้จะโหลดนานมาก ฉันรอหน้าโหลดนานหลายนาทีแล้ว
Robert Andrews

1
ตามที่เขียนไว้ในตอนแรกคาดว่าจะเป็น ID แต่ฉันได้แก้ไขคำตอบเพื่ออนุญาตให้ใช้คำว่า ID หรือวัตถุ WP_Term คุณไม่ได้เป็นคนเดียวที่รายงานปัญหาเกี่ยวกับรหัสนี้ - ควรจะเขียนใหม่เพื่อใช้get_ancestorsฟังก์ชั่นในตัวของ WP ซึ่งใหม่และไม่ได้รับการบันทึกไว้อย่างดีเมื่อเขียนคำตอบ ฉันจะโพสต์คำตอบใหม่เมื่อฉันมีเวลาทดสอบ
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;
    }
}

ขอบคุณ! ฉันพยายามทำสิ่งนี้แล้ว FYI ฉันคิดว่าคุณไม่มี paren ใกล้เคียงในบรรทัดที่ 1 ของฟังก์ชัน
supertrue

ฉันต้องเพิ่ม $ taxonomy เป็นพารามิเตอร์ตัวที่สองใน $ top_parent หรือไม่
supertrue

ฉันเพิ่มพารามิเตอร์ $ taxonomy แต่ได้รับข้อผิดพลาดเมื่อฉันใช้รหัสนี้ที่นี่: gist.github.com/1122631
supertrue

ใช่คุณทำ ฉันปรับปรุงคำตอบ
Bainternet

1
ฟังก์ชั่นของคุณดูเหมือนว่าลูป foreach ของคุณซ้อนกันลองนี้: pastebin.com/u48dxzapและหากคุณยังพบข้อผิดพลาดวางโค้ดทั้งหมดของคุณและฉันจะตรวจสอบ
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 );
}

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เพื่อรับกระสุนชื่อ id อะไรก็ได้ เพียงแค่ใช้$parentObj->slugหรือ$parentObj->nameเป็นตัวอย่าง



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.