控制分类类别列表以隐藏和取消隐藏详细信息

时间:2010-12-17 作者:Tom J Nowell

我有一个使用superfish脚本的垂直菜单,它显示自定义“productcategory”分类法中的类别。此菜单具有多个级别,并且具有层次结构。在树的每个分支的底部,我们有一个end类别,它代表一系列产品,客户会这样做not 要在此菜单中显示。

我正在使用此代码显示它:

<ul class="frontcatlist sf-menu">
<?php
    $a = array(
        \'title_li\'  =>  \'\',
        \'taxonomy\'  =>  \'productcategory\',
        \'depth\'     =>  2
    );
    wp_list_categories( $a );
?>
</ul>
这就是我目前所拥有的,关于正在显示的内容和未显示的内容。左为主要类别,每行向下一级为其子级:

alt text

红色的是菜单中未显示的类别,

然而,这并不是我的客户所需要的。虽然我可以使用原生Wordpress 3菜单生成符合要求的菜单,但这需要手动干预,无论从可用性角度还是从客户的意愿来看,这种干预都是不可取的。

由于一些主要类别具有应显示的子类别,而一些没有,因此深度参数将不够。相反,这是我所需要的,顶级类别始终显示:

alt text

我不知道如何做到这一点,我唯一的线索是一个定制的walker类来输出定制的html,在此过程中,我可能能够过滤掉我不想要的内容( any categories with a parent that has no children). 但是我看不到关于这个主题的足够的例子或文章,我也不想失去wordpress提供的类和标记

如果有人有任何想法,或知道教程论坛帖子或使用文章,我将不胜感激=)

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

我在walker类的基础上取得了一些进展,但由于wordpress似乎没有以与子节点相同的方式处理分类树的根节点,因此我还没有让ti完全按照需要工作。

因此,它会修剪结束菜单项,但如果该节点的父节点是根级别的节点,则会修剪该节点并留下一个空的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();
    }
  }
);

结束

相关推荐

如何将jQuery库加载到我的仪表板小部件中?

我试图使用wp\\u enqueue\\u脚本(“jquery”)加载内置的wp jquery库,但执行此操作时,我的jquery函数不起作用。只有当我硬编码脚本引用时,我的函数才能工作。。。有效的示例。。。(这在my functions.php文件中,该文件正在添加一个仪表板小部件)。。。/* Dashboard Widget */ if(is_admin()) { function my_dashboard_widget_function() { $