it-swarm.com.de

Steuern der Taxonomie-Kategorieauflistungen zum Ein- und Ausblenden von Details

Ich habe ein vertikales Menü mit dem Superfish-Skript, das Kategorien in einer benutzerdefinierten 'Produktkategorie'-Taxonomie anzeigt. Dieses Menü hat mehrere Ebenen und ist hierarchisch. Am Ende jedes Zweigs des Baums befindet sich die Endkategorie, die eine Reihe von Produkten darstellt, in denen der Kunde nicht anzeigen möchte dieses Menü.

Ich benutze diesen Code, um ihn anzuzeigen:

<ul class="frontcatlist sf-menu">
<?php
    $a = array(
        'title_li'  =>  '',
        'taxonomy'  =>  'productcategory',
        'depth'     =>  2
    );
    wp_list_categories( $a );
?>
</ul>

Dies ist, was ich derzeit in Bezug auf was zeigt und was nicht. Links sind die Hauptkategorien, und jede Zeile ist 1 Schritt tiefer als ihre Kinder:

alt text

Die roten sind die Kategorien, die nicht im Menü angezeigt werden,

Dies ist jedoch nicht das, was mein Kunde benötigt. Während ich mit den nativen Wordpress 3-Menüs ein Menü erstellen konnte, das die Anforderungen erfüllt, waren manuelle Eingriffe erforderlich, die sowohl aus Sicht der Benutzerfreundlichkeit als auch der Kundenwünsche unerwünscht sind.

Da einige Hauptkategorien Unterkategorien haben, die angezeigt werden sollten, und einige nicht, reicht der Tiefenparameter nicht aus. Stattdessen ist es das, was ich brauche, wobei die Kategorien der obersten Ebene immer Folgendes anzeigen:

alt text

Ich bin mir nicht sicher, wie ich das machen soll, und der einzige Hinweis, den ich habe, ist eine benutzerdefinierte Walker-Klasse zur Ausgabe von benutzerdefiniertem HTML, in der ich möglicherweise diejenigen herausfiltern kann, die ich nicht möchte (alle Kategorien mit einem übergeordneten Element, das) hat keine Kinder) . Aber ich konnte keine ausreichenden Beispiele oder Artikel zu diesem Thema finden und möchte lieber nicht die Klassen und Markups verlieren, die WordPress zur Verfügung stellt

Wenn jemand irgendwelche Gedanken hat oder von Tutorials, Forenbeiträgen oder Artikeln weiß, würde ich es sehr schätzen =)

1
Tom J Nowell

Ich habe einige Fortschritte gemacht, die auf Walker-Klassen basieren, aber ich bin nicht dazu gekommen, ganz nach Bedarf zu arbeiten, da WordPress die Wurzelknoten des Taxonomiebaums nicht auf die gleiche Weise wie die untergeordneten behandelt.

Infolgedessen werden die Elemente des Endmenüs entfernt, aber wenn das übergeordnete Element dieses Knotens ein Knoten auf Stammebene ist, wird der Knoten entfernt und ein leeres ul-Element bleibt zurück, <ul></ul>. Der Code, der dieses Problem auf untergeordneten Knoten behebt, funktioniert nicht für einen Stammknoten, sodass die gesamte Struktur ohne Untermenüs reduziert wird

class Post_Category_Walker extends Walker_Category {

    private $term_ids = array();
    function __construct( /*$post_id,*/ $taxonomy )  {
        // fetch the list of term ids for the given post
        $this->taxterms = get_terms( $taxonomy);
        $this->noshow = array();
    }
    function isdisplayable( $element, &$children_elements, $args ){
        $id = $element->term_id;
        if(in_array($element->term_id, $this->noshow)){
            return false;
        }
        $display = true;
        if($element->parent != 0){
            $display = false;
            if ( isset( $children_elements[ $id ] ) ) {
                $display = true;
            }
        }
        if($depth == 0){
            $display = true;
        }
        return $display;
    }
    function hasChildren( $element/*, &$children_elements*/){
        foreach($this->taxterms as $term){
            if($term->parent == $element->term_id){
                return true;
            }
        }
        return false;//(isset($children_elements[$element->term_id]));
    }
    function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {
        $display = $this->isdisplayable( $element, $children_elements, $args );
        $id = $element->term_id;
        if($element->parent != 0){

            if($this->hasChildren($element)){ //isset( $children_elements[ $id ] ) ) {
                $endnode = true;
                //print_r($children_elements[ $id ]);
                foreach($this->taxterms as $child){
                    if($child->parent == $element->term_id){
                        if($this->hasChildren($child)){
                            $endnode = false;
                            break;
                        }
                    }
                }
                if($endnode == true){
                    //$children_elements = NULL;
                    unset( $children_elements[ $id ] );
                    $newlevel = false;
                    $args[0]['has_children'] = 0;
                }
            }
        }else{
            // Wordpress separates out the terms into top level and child terms,
            // making the top level terms very costly as it passes in an empty 
            // array as the children_elements unlike the other terms
            //if($this->hasChildren($element)){
                foreach($this->taxterms as $term){
                    if($term->parent == $element->term_id){
                        if(!$this->hasChildren($term)){
                            $this->noshow[] = $term->term_id;
                            unset($newlevel);
                            $args[0]['has_children'] = 0;
                        }
                    }
                }
            //}
        }

        if ( $display )
            parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }
}
$a = array(
    'title_li'  =>  '',
    'taxonomy'  =>  'productcategory',
    'walker'    =>  new Post_Category_Walker('productcategory')
);
wp_list_categories( $a );

Eine vorübergehende Problemumgehung besteht darin, sie über das folgende JQuery-Snippet zu entfernen:

$("ul").each(
  function() {
    var elem = $(this);
    if (elem.children().length == 0) {
      elem.remove();
    }
  }
);
1
Tom J Nowell