Özel bir sınıflandırma teriminin en üst düzey üst öğesini edinin


14

Belirli bir terimin en üst düzey ebeveynini nasıl edinebilirim?

wp_get_object_termsGönderilerde sınıflandırma terimleri almak için kullanıyorum , ancak tüm etiketli terimleri göstermek yerine, yalnızca etiketli terimlerin üst düzey ebeveynlerini göstermek istiyorum.

Yani bunlar benim seçtiğim terimler ise, sadece Kahvaltı, Öğle Yemeği ve Akşam Yemeği göstermek istiyorum.

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

Bunu nasıl yapabilirim?

Yanıtlar:


22

Bainternet'in cevabına dayanan bu kod için Ivaylo'ya teşekkürler.

Aşağıdaki ilk işlev, get_term_top_most_parentbir terimi ve sınıflandırmayı kabul eder ve terimin en üst düzey ebeveynini (veya ebeveynsizse terimin kendisini) döndürür; ikinci işlev ( get_top_parents) döngüde çalışır ve bir sınıflandırma verildiğinde bir gönderinin terimlerinin en üst düzey ebeveynlerinin HTML listesini döndürür.

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

Yukarıdaki işleve sahip olduğunuzda, döndürülen sonuçların üzerinden geçebilir wp_get_object_termsve her bir terimin en üst ebeveyni görüntüleyebilirsiniz:

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

Sadece üst düzey terimleri değil, en üstteki ebeveynin altındaki tüm terimleri hiyerarşik olarak bastıracak bir değişiklik görmek isterim.
Robert Andrews

@RobertAndrews Tek bir terimin çocuklarına ihtiyacınız varsa, WordPress'in yerleşik get_term_children( $term, $taxonomy )( belgelerini ) kullanabilirsiniz. Belirli bir terimin üst düzey ebeveynin tüm çocukları almak istiyorsa, böyle, içine yukarıda sonucu geçebileceği: get_term_children( get_term_top_most_parent( $term, $taxonomy ), $taxonomy ).
Ocak'ta

Bu durumda $ terimi nedir, yani. nesne, terimin adı, ön ekli sınıflandırma_adı_sayısı? Her durumda, bu yöntemin yüklenmesi son derece uzundur. Sayfanın birkaç dakika boyunca yüklenmesini bekliyordum.
Robert Andrews

1
Başlangıçta yazdığı gibi bir kimlik bekleniyordu, ancak bir terim kimliği veya WP_Term nesnesine izin vermek için cevabı düzenledim. Bu kodla ilgili bir sorunu bildiren tek kişi siz değilsiniz - ideal olarak, WP'nin get_ancestorsyeni ve cevap yazıldığında iyi belgelenmemiş yerleşik işlevini kullanmak için yeniden yazılması gerekir . Test etmek için zamanım olduğunda yeni bir cevap göndereceğim.
Ocak'ta


8

Aşağıda, herhangi bir terimin en üst veli terimini almanızı sağlayacak basit bir işlev vardır:

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

Bu işleve sahip olduğunuzda, yalnızca döndürülen sonuçların üzerinden geçebilirsiniz 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;
    }
}

Teşekkürler! Bunu şimdi deniyorum. FYI Bence fonksiyonun 1. satırında yakın bir paren eksik.
supertrue

top_parent içindeki ikinci bir parametre olarak $ sınıflandırma eklemem gerekir mi?
supertrue

$ Taxonomy parametresini ekledim ama bu kodu kullandığımda bir hata alıyorum, burada: gist.github.com/1122631
supertrue

evet biliyorsun. Cevabı güncelledim.
Bainternet

1
senin işlevin kırık görünüyor foreach döngüleri örtüşen bunu deneyin: pastebin.com/u48dxzap ve hala bir hata alırsanız tüm kod yapıştırın ve ben kontrol edeceğiz
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
Lütfen kodunuzla birlikte bir açıklama ekleyin.
s_ha_dum

4

Aynı sorunu yaşadım ve kolayca çözdüm. Şuna bir bak:

Tanımlayın $taxonomy. Verileri elde etmek istediğiniz sınıflandırma olabilir. Bunu yaptıktan sonra şunları yapabilirsiniz:

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

Şimdi böyle bir şey var:

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

Ve $parentObjsülük, isim, kimlik, ne olursa olsun almak için kullanabilirsiniz . Sadece $parentObj->slugveya $parentObj->nameörnek olarak kullanarak .


2

En kolay yol:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.