Как превратить поле количества товара в выпадающий список?

Непосредственно на странице товара, прямо перед кнопкой добавления в корзину, а также и в самой корзине есть поле с выбором количества товара. По умолчанию это обычный input, но в этом уроке мы попробуем превратить его в выпадающий список <select>.

Также хочу порекомендовать вам свой видеокурс по WooCommerce, в нём мы создаём тему для интернет-магазина с нуля, на основе готовой HTML вёрстки, вот ссылка.

Прежде, чем приступим к коду, вот скриншоты того, что у нас получится. Поле заменится не только на странице товара, но и в корзине.

Поле выбора количества товара на странице товара
Поле выбора количества товара перед добавлением товара в корзину на странице самого товара. Как видите, оно превратилось в выпадающий список.
Поле выбора количества товара в корзине WooCommerce
Поле количества товара в корзине тоже превратилось в выпадающий список.

Для того, чтобы это сделать, нам не понадобится ни менять шаблоны WooCommerce ни использовать фильтр-хуки.

Функция woocommerce_quantity_input(), которая и выводит везде поле количества товара – переопределяемая (pluggable), это значит, что если вы создадите функцию с точно таким же названием в functions.php вашей теме или в плагине, то будет использоваться ваша функция.

function woocommerce_quantity_input( $args = array(), $product = null, $echo = true ) {
 
	if ( is_null( $product ) ) {
		$product = $GLOBALS[ 'product' ];
	}
 
	// значения по умолчанию
	$defaults = array(
		'input_name' => 'quantity',
		'input_value' => '1',
		'max_value' => apply_filters( 'woocommerce_quantity_input_max', -1, $product ),
		'min_value' => apply_filters( 'woocommerce_quantity_input_min', 0, $product ),
		'step' => 1,
	);
 
	// этот фильтр-хук не убирать
	$args = apply_filters( 'woocommerce_quantity_input_args', wp_parse_args( $args, $defaults ), $product );
 
	// немного валидаций
	$args[ 'min_value' ] = max( $args[ 'min_value' ], 0 );
	$args[ 'max_value' ] = 0 < $args[ 'max_value' ] ? $args[ 'max_value' ] : 20;
 
	if ( '' !== $args['max_value'] && $args[ 'max_value' ] < $args[ 'min_value' ] ) {
		$args['max_value'] = $args[ 'min_value' ];
	}
 
	$options = '';
 
	// запускаем цикл создания выпадающего селекта
	for ( $count = $args[ 'min_value' ]; $count <= $args[ 'max_value' ]; $count = $count + $args[ 'step' ] ) {
 
		// Cart item quantity defined?
		if ( '' !== $args[ 'input_value' ] && $args[ 'input_value' ] >= 1 && $count == $args[ 'input_value' ] ) {
			$selected = 'selected';
		} else {
			$selected = '';
		}
 
		$options .= '<option value="' . $count . '"' . $selected . '>' . $count . '</option>';
 
	}
 
	$html = '<div class="quantity"><select name="' . $args[ 'input_name' ] . '">' . $options . '</select></div>';
 
	if ( $echo ) {
		echo $html;
	} else {
		return $html;
	}
 
}
  • Если вы взглянете в оригинальную функцию, то заметите, что внутри неё также были и хук woocommerce_quantity_input_step – я его убрал, но если вы хотите разрешить плагинам впоследствии редактировать вашу функцию через хуки, можете их вернуть.
  • Хук woocommerce_quantity_input_args, напротив, трогать нельзя, т.к. на него законнекчено максимальное количество товара в зависимости от наличия на складе.
  • Также внутри функции у нас доступен объект товара $product, и на его основе мы можем как-то по-своему настроить поле с количеством.

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 7

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал