Cum filtrezi produse-n WooCommerce după clasa de transport

Filtrarea produselor după clasa de transport este de fapt relativ simplu, având în vedere că WooCommerce este proiectat să adauge automat clasa de livrare în lista de conditii de interogare atunci când este prezentă ca parametru în URL, cu denumirea product_shipping_class.

Sursa: Envato Elements

Sursa: Envato Elements

Așadar, tot ce ne mai rămâne de făcut este să adăugăm, în zona de filtrare a paginii de produse din panoul de administrare, un element de tip drop-down, cu numele (atributul HTML name) amintit mai sus, care să afișeze clasele de livrare. În plus, trebuie să și marcăm corespunzător clasa de livrare aleasă.

Pentru a obține ce ne dorim, plecăm de la filtrul woocommerce_product_filters (am întins unele zone de cod pe mai multe linii nu că ar fi fost excesiv de lungi, ci pentru că voiam să-mi încapă lejer în ecran fără scroll orizontal):

function s02_add_shipping_class_filter($filtersHtml) {
	$options = s02_get_available_shipping_classes_options();
	$selected = s02_get_selected_shipping_class_filter_option();

	$filtersHtml .= s02_render_shipping_class_filter_dropdown($options, 
		$selected);

	return $filtersHtml;
}

//Prepare an array of available shipping classes.
// Keys are slugs, values are names.
function s02_get_available_shipping_classes_options() {
	$options = array();
	$sCasses = WC_Shipping::instance()->get_shipping_classes();

	foreach ($sCasses as $sc) {
		/** @var \WP_Term $sc */
		$options[$sc->slug] = $sc->name;
	}

	return $options;
}

//Retrieve the currently selected option from HTTP GET
function s02_get_selected_shipping_class_filter_option() {
	return !empty($_GET['product_shipping_class'])
		? sanitize_text_field($_GET['product_shipping_class'])
		: '';
}

//Render the actual filter element
function s02_render_shipping_class_filter_dropdown(array $options, 
		$selectedKey) {

	$html = '<select ' 
		. 'name="product_shipping_class" ' 
		. 'id="s02_product_shipping_class_filter"' 
		. '>';
	
	$html .= '<option value="">Filter by shipping class</option>';
	foreach ($options as $value => $name) {
		$html .= '<option value="' 
				. esc_attr($value) . '" ' 
				. ( $value === $selectedKey 
					? 'selected="selected"' 
					: '' ) 
				. '>' 
				. esc_html($name) 
				. '</option>';
	}

	$html .= '</select>';
	return $html;
}

add_filter('woocommerce_product_filters', 
	's02_add_shipping_class_filter', 
	20, 
	1);