繁体   English   中英

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

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

由于我的商店有很多子类别,因此我试图从小部件中排除仅包含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;}

我想到的一种有趣的方式是使用您定制的Walker列出类别。 那里有一些选择,包括:

  1. 您可以检查某个项目是否有1个产品,然后可以添加条件标签并阻止其显示。

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

我个人喜欢第二种方法,因为它允许您以后对项目进行任何处理。

下面是它的工作原理:

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

暂无
暂无

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

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