根据产品数量从小部件中删除类别

时间:2016-12-24 12:12:46

标签: php wordpress woocommerce

由于我的商店有很多子类别,我试图从我的小部件中排除所有类别,其中只有1个产品。

现在我发现以下代码可以通过ID排除猫,但在这种情况下这样做太费时间了。有关如何编辑此代码以通过帖子计数排除的任何建议吗?

    add_filter( 'woocommerce_product_categories_widget_args', 'wdm_edit_product_cat_widget_args' ); function wdm_edit_product_cat_widget_args( $cat_args ) {
$cat_args['exclude'] = array('10387');
return $cat_args;}

1 个答案:

答案 0 :(得分:1)

我想到的一个有趣的方法是使用您定制的Walker列出类别。你有一些选择,包括:

  1. 您可以检查某个商品是否包含1个商品,然后您可以添加商品 条件标签并防止它出现。

  2. 您可以在li类中添加该项目中的产品数量 使用css隐藏您的某些类(.cat-count-1)中的项目 情况下。

  3. 我个人喜欢第二种方式,因为它可以让你以后随意做任何事情。

    以下是它的工作原理:

    1-在主题的functions.php文件中添加以下代码:

    add_filter('woocommerce_product_categories_widget_args', 'use_different_walker_with_counts');
    function use_different_walker_with_counts($args){
      include_once 'wc_walker_with_counter_class.php';
      $args['walker'] = new WC_Product_Cat_List_Counter_Walker;
      return $args;
    }
    

    这告诉wordpress使用另一个定制的助行器。

    2-使用以下行在主题文件夹名称wc_walker_with_counter_class.php中添加新文件:

    <?php
    
    
    class WC_Product_Cat_List_Counter_Walker extends Walker {
    
        /**
         * What the class handles.
         *
         * @var string
         */
        public $tree_type = 'product_cat';
    
        /**
         * DB fields to use.
         *
         * @var array
         */
        public $db_fields = array(
            'parent' => 'parent',
            'id'     => 'term_id',
            'slug'   => 'slug'
        );
    
        /**
         * Starts the list before the elements are added.
         *
         * @see Walker::start_lvl()
         * @since 2.1.0
         *
         * @param string $output Passed by reference. Used to append additional content.
         * @param int $depth Depth of category. Used for tab indentation.
         * @param array $args Will only append content if style argument value is 'list'.
         */
        public function start_lvl( &$output, $depth = 0, $args = array() ) {
            if ( 'list' != $args['style'] )
                return;
    
            $indent = str_repeat("\t", $depth);
            $output .= "$indent<ul class='children'>\n";
        }
    
        /**
         * Ends the list of after the elements are added.
         *
         * @see Walker::end_lvl()
         * @since 2.1.0
         *
         * @param string $output Passed by reference. Used to append additional content.
         * @param int $depth Depth of category. Used for tab indentation.
         * @param array $args Will only append content if style argument value is 'list'.
         */
        public function end_lvl( &$output, $depth = 0, $args = array() ) {
            if ( 'list' != $args['style'] )
                return;
    
            $indent = str_repeat("\t", $depth);
            $output .= "$indent</ul>\n";
        }
    
        /**
         * Start the element output.
         *
         * @see Walker::start_el()
         * @since 2.1.0
         *
         * @param string $output Passed by reference. Used to append additional content.
         * @param int $depth Depth of category in reference to parents.
         * @param integer $current_object_id
         */
        public function start_el( &$output, $cat, $depth = 0, $args = array(), $current_object_id = 0 ) {
            $output .= '<li class="cat-item cat-item-' . $cat->term_id . ' cat-count-' . $cat->count;
    
            if ( $args['current_category'] == $cat->term_id ) {
                $output .= ' current-cat';
            }
    
            if ( $args['has_children'] && $args['hierarchical'] ) {
                $output .= ' cat-parent';
            }
    
            if ( $args['current_category_ancestors'] && $args['current_category'] && in_array( $cat->term_id, $args['current_category_ancestors'] ) ) {
                $output .= ' current-cat-parent';
            }
    
            $output .=  '"><a href="' . get_term_link( (int) $cat->term_id, $this->tree_type ) . '">' . _x( $cat->name, 'product category name', 'woocommerce' ) . '</a>';
    
            if ( $args['show_count'] ) {
                $output .= ' <span class="count">(' . $cat->count . ')</span>';
            }
        }
    
        /**
         * Ends the element output, if needed.
         *
         * @see Walker::end_el()
         * @since 2.1.0
         *
         * @param string $output Passed by reference. Used to append additional content.
         * @param int $depth Depth of category. Not used.
         * @param array $args Only uses 'list' for whether should append to output.
         */
        public function end_el( &$output, $cat, $depth = 0, $args = array() ) {
            $output .= "</li>\n";
        }
    
        /**
         * Traverse elements to create list from elements.
         *
         * Display one element if the element doesn't have any children otherwise,
         * display the element and its children. Will only traverse up to the max.
         * depth and no ignore elements under that depth. It is possible to set the.
         * max depth to include all depths, see walk() method.
         *
         * This method shouldn't be called directly, use the walk() method instead.
         *
         * @since 2.5.0
         *
         * @param object $element Data object
         * @param array $children_elements List of elements to continue traversing.
         * @param int $max_depth Max depth to traverse.
         * @param int $depth Depth of current element.
         * @param array $args
         * @param string $output Passed by reference. Used to append additional content.
         * @return null Null on failure with no changes to parameters.
         */
        public function display_element( $element, &$children_elements, $max_depth, $depth = 0, $args, &$output ) {
            if ( ! $element || ( 0 === $element->count && ! empty( $args[0]['hide_empty'] ) ) ) {
                return;
            }
            parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
        }
    }
    

    3-然后,您可以继续在样式文件中执行您想要的操作,通常是style.css。在这种情况下,我们希望隐藏计数为1的项目,因此我们添加:

    .cat-count-1 {
        display: none;
    }