简体   繁体   English

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

[英]Remove categories from widget based on number of products

Since my shop has a lot of subcategories I'm trying to exclude all categories from my widget which only have 1 product inside. 由于我的商店有很多子类别,因此我试图从小部件中排除仅包含1种产品的所有类别。

Now I found following code to exclude cats by ID but this would be too time consuming to do in this case. 现在,我发现以下代码按ID排除了猫,但是在这种情况下这样做会很费时间。 Any suggestions on how to edit this code to exclude by post count? 关于如何编辑此代码以按帖子数排除的任何建议?

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

One fun way I thought about was to use your custom made Walker for listing the categories. 我想到的一种有趣的方式是使用您定制的Walker列出类别。 There you have some options, including: 那里有一些选择,包括:

  1. You can check if a certain item has 1 products, then you can add a conditional tag and prevent it from showing up. 您可以检查某个项目是否有1个产品,然后可以添加条件标签并阻止其显示。

  2. You can add the count of products in that item in the li class and using css hide items with certain classes (.cat-count-1) in your case. 您可以在li类中添加该项目中的产品数量,并使用css隐藏具有某些类(.cat-count-1)的项目。

I personally like the second way because it allows you to do whatever you want with items later. 我个人喜欢第二种方法,因为它允许您以后对项目进行任何处理。

Here is how it works: 下面是它的工作原理:

1- Add this piece of code in your theme's functions.php file: 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;
}

this tells wordpress to use another custom made walker. 这告诉wordpress使用另一个定制的助行器。

2- Add a new file in your theme folder name wc_walker_with_counter_class.php with these lines: 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- Then you can go ahead and do what you want in your styles file, usually style.css . 3-然后,您可以继续在样式文件(通常是style.css In this case we want to hide items with count of one so we add: 在这种情况下,我们要隐藏计数为1的项目,因此我们添加:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM