Изменение количества товара прямо на странице «Оформление заказа»

В этом уроке хочу поделиться с вами очень интересным сниппетом, который позволяет добавить поле изменения количества товара прямо на страницу оформления заказа. Это например может быть полезно для интернет-магазинов без корзины.

Давайте взглянем на то, как это будет выглядеть сначала:

поле изменения количества товара при оформлении заказа WooCommerce
Поле динамически обновляет общую стоимость заказа также.

Ну хорошо, как же его теперь сделать? Ну вообще нам понадобится всего два хука:

  • woocommerce_checkout_cart_item_quantity – при помощи этого хука мы выведем поле изменения количества рядом с названием товара.
  • woocommerce_checkout_update_order_review – этот хук уже будет динамически изменять общую стоимость заказа.

Погнали, код:

add_filter( 'woocommerce_checkout_cart_item_quantity', 'true_add_qty_field', 25, 3 );
function true_add_qty_field( $product_quantity, $cart_item, $cart_item_key ) {
 
	// пропустим объект товара через фильтр, на всякий случай
	$product = apply_filters( 'woocommerce_cart_item_product', $cart_item[ 'data' ], $cart_item, $cart_item_key );
 
	// если включена опция на продажу товара индивидуально, неплохо бы её учесть
	if( $product->is_sold_individually() ) {
		// ничего не делаем
		return $product_quantity;
	}
 
	// выводим поле изменения количества товара
	$product_quantity = woocommerce_quantity_input( 
		array(
			'input_name'  => 'shipping_method_qty_' . $product->get_id(),
			'input_value' => $cart_item[ 'quantity' ],
			'max_value'   => $product->get_max_purchase_quantity(),
			'min_value'   => '0',
		),
		$product, 
		false 
	);
	$product_quantity .= '<input type="hidden" name="product_key_' . $product->get_id() . '" value="' . $cart_item_key . '">';
 
	return $product_quantity;
 
}
 
add_action( 'woocommerce_checkout_update_order_review', 'true_update_item_quantity_checkout' );
function true_update_item_quantity_checkout( $post_data ) {
 
	parse_str( $post_data, $post_data_array );
	$updated_qty = false;
	foreach ( $post_data_array as $key => $value ) {
		if( 'shipping_method_qty_' === substr( $key, 0, 20 ) ) {
			$id = substr( $key, 20 );
			WC()->cart->set_quantity( $post_data_array[ 'product_key_' . $id ], $post_data_array[ $key ], false );
			$updated_qty = true;
		}
	}
	if ( $updated_qty ) {
		WC()->cart->calculate_totals();
	}
}

Несколько комментариев:

  • В коде мы неоднократно обращаемся к методам объекта WC_Product, о них можно подробнее почитать в этом гайде.
  • Если не знаете, куда вставлять код, то рассказываю тут.
  • Также, если хотите узнать больше про кастомизацию страницы оформления заказа, то рекомендую отдельный видеоурок о ней.

Миша

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

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

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

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

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

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

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