it-swarm.com.de

Holen Sie sich direkte Kinder der benutzerdefinierten Taxonomie

Ich habe ausgiebig gegoogelt und mein Bestes versucht, aber ich kann die Kinder der ersten Stufe der benutzerdefinierten Taxonomie im folgenden Code nicht zum Funktionieren bringen! Es wird nur die übergeordnete Ebene angezeigt. Was ich versuche zu erreichen, ist das folgende:

Level 1  <--- at the moment, it only displays this level
  Level 2  <-- I want to display this level too
    Level 3  <-- but NOT this level

Das ist mein Code bis jetzt:

function my_dropdown_categories( $taxonomy, $current_selected = '', $include = null ) {
// Get all terms of the chosen taxonomy
$terms = get_terms($taxonomy, array('orderby' => 'name'));

// our content variable
$list_of_terms = '<select id="location" class="selectboxSingle" name="location">';

if ( ! is_wp_error( $terms ) ) foreach($terms as $term){

// If include array set, exclude unless in array.
if ( is_array( $include ) && ! in_array( $term->slug, $include ) ) continue;

$select = ($current_selected == $term->slug) ? "selected" : ""; // Note: ==

if ($term->parent == 0 ) {

    // get children of current parent.
    // $tchildren = get_term_children($term->term_id, $taxonomy); <- gets ALL children

    $uchildren =get_terms( $taxonomy, array('hide_empty' => 0, 'parent' => $term->term_id ));

    $children = array();
    foreach ($uchildren as $child) {
        $cterm = get_term_by( 'id', $child, $taxonomy );
        // If include array set, exclude unless in array.
        if ( is_array( $include ) && ! in_array( $cterm->slug, $include ) ) continue;
        $children[$cterm->name] = $cterm;
    }
    ksort($children);

    // PARENT TERM      
    if ($term->count > 0) {
      $list_of_terms .= '<option class ="group-result" value="'.$term->slug.'" '.$select.'>' . $term->name .' </option>';
    } else {
      $list_of_terms .= '<option value="'.$term->slug.'" '.$select.'>'. $term->name .' </option>';
    };

    // now the CHILDREN.
    foreach($children as $child) {
       $select = ($current_selected == $child->slug) ? "selected" : ""; // Note: child, not cterm
       $list_of_terms .= '<option class="result-sub" value="'.$child->slug.'" '.$select.'>'. $child->name.' </option>';
    } //end foreach
  }
}

$list_of_terms .= '</select>';

return $list_of_terms;
}

Wenn mir jemand bei diesem Biest helfen kann, bist du mein verrückter Held!

EDIT(weitere Informationen basierend auf der Antwort von Pieter):

Das wird ausgegeben (alle Eltern):

Elternteil 1

- Elternteil 1

- Elternteil 2

- Elternteil 3

- Elternteil 4

Elternteil 2

- Elternteil 2

- Elternteil 1

- Elternteil 3

usw

1
Guit4eva

Sie haben hier zwei Probleme, eines ist ein Leistungsproblem, das andere ist ein großes Problem, das einen Haufen Fehler zurückgeben sollte, wenn Sie das Debuggen aktivieren

Das Leistungsproblem hier ist Ihre erste Instanz, bei der Sie die Bedingungen erhalten. Es scheint, dass Ihr Ziel hier ist, nur Top-Level-Begriffe zu bekommen, aber Sie bekommen alle. Ich würde einfach 'parent' => 0 zu den Argumenten hinzufügen, um nur Begriffe der obersten Ebene zu erhalten. Sie können dann die Bedingung löschen, in der Sie if ( $term->parent == 0 ) überprüfen, da alle Begriffe Begriffe der obersten Ebene sind, die alle 0 als übergeordneten Begriff haben, sodass diese Bedingung immer true zurückgibt

Ihr großes Problem ist mit diesem Code, und ich verstehe Ihre Logik hier nicht

    $uchildren =get_terms( $taxonomy, array('hide_empty' => 0, 'parent' => $term->term_id ));

    $children = array();
    foreach ($uchildren as $child) {
        $cterm = get_term_by( 'id', $child, $taxonomy );
        // If include array set, exclude unless in array.
        if ( is_array( $include ) && ! in_array( $cterm->slug, $include ) ) continue;
        $children[$cterm->name] = $cterm;
    }
    ksort($children);

Sie haben Recht, Ihre direkten Kinder zu bekommen, daher ist Ihre Erklärung von $uchildren in Ordnung. Von dort geht alles drunter und drüber

  • Warum verwenden Sie get_term_by() hier? $child enthält bereits die Termeneigenschaften, da Sie get_terms() zum Abrufen der Terms verwendet haben.

  • Sie verwenden hier nicht nur get_term_by() falsch, sondern Ihre Argumente sind ungültig und Sie übergeben auch ein vollständiges Objekt daran. Konsultieren Sie den Codex für die ordnungsgemäße Verwendung dieser Funktion. Alles in allem sollte dieser Abschnitt aus Ihrem Code entfernt werden

Dieser Abschnitt sollte ungefähr so ​​aussehen

    $uchildren =get_terms( $taxonomy, array('hide_empty' => 0, 'parent' => $term->term_id ));

    $children = array();
    foreach ($uchildren as $child) {
        if ( is_array( $include ) && ! in_array( $child->slug, $include ) ) continue;
        $children[$child->name] = $child;
    }
    ksort($children);

BEARBEITEN

Hier ist ein voll funktionsfähiger Code mit einigen behobenen Fehlern. Bitte beachten Sie meine Kommentare im Code für die Updates

function my_dropdown_categories( $taxonomy, $current_selected = '', $include = null ) 
{
    /*
     * Declare your variable first. Without this, your code has a bug if no terms are found
     */
    $list_of_terms = '';

    /**
    * Get all parent terms. Note we use 'parent' => 0 to only get top level terms
    *
    * @see get_terms
    * @link http://codex.wordpress.org/Function_Reference/get_terms
    */
    $terms = get_terms( $taxonomy, array( 'orderby' => 'name', 'parent' => 0 ) );

    /*
    * Use curlies here to enclose your statement. Also, check whether or not you have terms
    */
    if ( $terms && ! is_wp_error( $terms ) ) {

        /*
        * Moved this section inside your if statement. We don't want to display anything on empty terms
        */
        $list_of_terms .= '<select id="location" class="selectboxSingle" name="location">';

        foreach ( $terms as $term ) {

            // If include array set, exclude unless in array.
            if ( is_array( $include ) && ! in_array( $term->slug, $include ) ) continue;

            $select = ($current_selected == $term->slug) ? "selected" : ""; // Note: ==

            /*
             * Use the parent term term id as parent to get direct children of the term
             * Use child_of if you need to get all descendants of a term
             */
            $uchildren = get_terms( $taxonomy, array('hide_empty' => 0, 'parent' => $term->term_id ));

            $children = array();
            foreach ($uchildren as $child) {
                // If include array set, exclude unless in array.
                if ( is_array( $include ) && ! in_array( $child->slug, $include ) ) continue;
                $children[$child->name] = $child;
            }
            ksort($children);

            // PARENT TERM      
            if ($term->count > 0) {
                $list_of_terms .= '<option class ="group-result" value="'.$term->slug.'" '.$select.'>' . $term->name .' </option>';
            } else {
                $list_of_terms .= '<option value="'.$term->slug.'" '.$select.'>'. $term->name .' </option>';
            };

            // now the CHILDREN.
            foreach($children as $child) {
                $select = ($current_selected == $child->slug) ? "selected" : ""; // Note: child, not cterm
                $list_of_terms .= '<option class="result-sub" value="'.$child->slug.'" '.$select.'>'. $child->name.' </option>';
            } //end foreach

        }

        /*
        * Moved this section inside your if statement. We don't want to display anything on empty terms
        */
        $list_of_terms .= '</select>';

    }
    return $list_of_terms;
}
3
Pieter Goosen

Überprüfen Sie diesen Code

$uchildren =get_terms( 'category', array('hide_empty' => false, 'parent' => $term->term_id ));

$children = array();
foreach ($uchildren as $child) {
    $cterm = get_term_by( 'id', $child, $taxonomy );
    // If include array set, exclude unless in array.
    if ( is_array( $include ) && ! in_array( $cterm->slug, $include ) ) continue;
    $children[$cterm->name] = $cterm;
}

Diese Linie

$cterm = get_term_by( 'id', $child, $taxonomy ); 

geht davon aus, dass $ child eine ID (und eine Ganzzahl) sein wird, wobei:

foreach ($uchildren as $child) {

gibt uns ein Objekt

Dies ist auch der Grund, warum dies nicht so funktioniert, wie Sie es möchten:

if ( is_array( $include ) && ! in_array( $cterm->slug, $include ) ) continue;

Von hier aus ist Müll, den ich gepostet hatte, aber der gesunde Menschenverstand setzte sich durch, bis ...

Lass uns den lustigen Teil machen:

var_dump($term):

Beachten Sie den Typ jeder Eigenschaft:

object(stdClass)(9) {
    ...
    ["parent"]=>
    string(1) "0"
    ...
}

Siehe die parent. Es ist eine Schnur. Ich weiß, logischerweise sollte es eine ganze Zahl sein, aber es ist eine Zeichenfolge. Es ist scheiße, richtig!

Ihre if ($term->parent == 0 ) { Bedingung wird also nicht erfüllt. Versuchen Sie dies stattdessen:

if ( empty( $term->parent ) ) {

hier

0
Saurabh Shukla