可以透過製作其定義的 walker 類的副本並對其進行編輯來操作 WooCommerce 產品類別選單。
該 WC_Product_Cat_List_walker 類就在 woocommerce/includes/walkers/class-product-cat-list-walker.php,可以使這個副本,並將其包含在你的子主題,包括它。最好在您的子主題中建立一個類子資料夾並在那裡新增檔案 – 然後透過您的 functions.php 檔案將其包含在內…
require_once( get_stylesheet_directory() . '/classes/class-product-cat-list-walker.php');
/** * WC_Product_Cat_List_Walker class * * @extends Walker * @class WC_Product_Cat_Dropdown_Walker * @version 2.3.0 * @package WooCommerce/Classes/Walkers * @author WooThemes */ if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly } if ( ! class_exists( 'WC_Product_Cat_List_Walker', false ) ) : class WC_Product_Cat_List_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 object $cat * @param int $depth Depth of category in reference to parents. * @param array $args * @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; if ( $args['current_category'] == $cat->term_id ) { $output .= ' current-cat'; } if ( $args['has_children'] && $args['hierarchical'] && ( empty( $args['max_depth'] ) || $args['max_depth'] > $depth + 1 ) ) { $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>'; // Outputting the count in a link to the category archive if ( $args['show_count'] ) { $output .= '<a href="' . get_term_link( (int) $cat->term_id, $this->tree_type ) . '"> <span class="count">(' . $cat->count . ')</span></a>'; } } /** * 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 object $cat * @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 ); } } endif;