Woocommerce dispone di un apposito widget che consente di inserire nelle sidebar del tema le voci delle categorie dei prodotti, sotto forma di elenco o di menù a discesa.

Se il template del nostro tema non dispone di una sidebar, o se vogliamo stampare le categorie dei prodotti al di fuori di essa, è possibile utilizzare la funzione di Woocommerce wc_product_dropdown_categories() in modalità standalone.

Io ho modificato questa funzione per utilizzare il markup html che desideravo, e soprattutto per rendere la select dropdown funzionante anche nel caso in cui Javascript sia disabilitato, seguendo le convenzioni dell’unobtrusive scripting.

function my_product_dropdown_categories( $args = array() ) {
	global $wp_query, $woocommerce;
	
	$defaults = array(
		'pad_counts'         => 1,
		'show_count'        => 1,
		'hierarchical'       => 1,
		'hide_empty'         => 1,
		'show_uncategorized' => 1,
		'orderby'            => 'name',
		'selected'			 => isset($wp_query->queried_object->slug)  ? $wp_query->queried_object->slug : '',
		'menu_order'         => false
	);

	$args = wp_parse_args( $args, $defaults );

	if ( $args['orderby'] == 'order' ) {
		$args['menu_order'] = 'asc';
		$args['orderby']    = 'name';
	}

	$terms = get_terms( 'product_cat', $args );

	if ( ! $terms )
		return;
	$output  ="<form class='woocommerce-product-cat' method='get'>";
	$output .= "<div class=\"form-group\"><select name='product_cat' class='dropdown_product_cat form-control input-sm'>";
	$output .= '<option value="">' . __( 'Select a category', 'woocommerce' ) . '</option>';
	$output .= wc_walk_category_dropdown_tree( $terms, 0, $args );

	$output .="</select></div>";
	$output .="<noscript><button type=\"submit\" class=\"btn btn-standard btn-sm\">submit</button></noscript>";
	$output .="</form>";

	echo $output;
}

La seguente funzione aggiunge l’interatività javascript sulla select html in modo da effettuare il redirect verso la pagina della categoria prodotti che è stata selezionata nel dropdown:

function get_product_dropdown_categories() {
	
	my_product_dropdown_categories();
	
	wc_enqueue_js("
				jQuery('.dropdown_product_cat').change(function(){
					if(jQuery(this).val() != '') {
						location.href = '" . home_url() . "/?product_cat=' + jQuery(this).val();
					} else {
						location.href = '" . get_permalink( woocommerce_get_page_id( 'shop' ) ) . "'
					}
				});
			");
	
}

La funzione get_product_dropdown_categories() si può invocare a piacimento nella posizione voluta all’interno del template del proprio tema, personalizzando gli argomenti che sono gli stessi della funzione del core di wordpress get_terms().