Управление списками категорий таксономии для скрытия и отображения специфики


У меня есть вертикальное меню, использующее скрипт superfish, который показывает категории в пользовательской таксономии "категория продукта". Это меню имеет несколько уровней и является иерархическим.В нижней части каждой ветви дерева у нас есть конечная категория, которая представляет ассортимент товаров, которые клиент не хочет показывать в этом меню.

Я использую этот код для его отображения:

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

Это то, что у меня сейчас есть с точки зрения того, что показывает, а что нет. слева - основные категории, и каждая строка на 1 шаг ниже своих дочерних элементов:

alt text

Красным цветом отмечены категории, которые не отображаются в меню,

Однако это не то, что нужно моему клиенту. Хотя я мог бы создать меню, соответствующее требованиям, используя собственные меню Wordpress 3, для этого потребовалось бы ручное вмешательство, вмешательство, которое нежелательно, как с точки зрения удобства использования, так и с точки зрения пожеланий клиентов.

Поскольку некоторые основные категории имеют подкатегории, которые должны быть показаны, а некоторые нет, параметра глубины будет недостаточно. Вместо этого это то, что мне нужно, с категориями верхнего уровня, всегда отображающими:

alt text

Я не уверен, как это сделать, и единственная подсказка, которая у меня есть, - это пользовательский класс walker для вывода пользовательского html, во время которого я мог бы отфильтровать те, которые мне не нужны (любые категории с родителем, у которого нет детей). Но я не смог увидеть достаточных примеров или статей по тема, и я бы предпочел не терять классы и разметку, которые предоставляет wordpress

Если у кого-нибудь есть какие-либо мысли или он знает о сообщениях на форуме или статьях об использовании, я был бы очень признателен =)

Author: Tom J Nowell, 2010-12-17

1 answers

Я добился некоторого прогресса на основе классов walker, но не смог заставить ti работать так, как нужно, потому что wordpress, похоже, не обрабатывает корневые узлы дерева таксономии так же, как дочерние.

В результате он удаляет конечные пункты меню, но если родительский узел этого узла является узлом корневого уровня, он удаляет узел и оставляет пустой элемент ul позади, <ul></ul>. Код, устраняющий эту проблему на дочерних узлах, не работает для корневого узла, в результате чего весь выравнивание структуры без подменю

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

Временный обходной путь состоит в том, чтобы удалить их с помощью следующего фрагмента jquery:

$("ul").each(
  function() {
    var elem = $(this);
    if (elem.children().length == 0) {
      elem.remove();
    }
  }
);
 1
Author: Tom J Nowell, 2010-12-17 16:09:38