Как изменить цену товара в корзине в зависимости от его количества в ней?

В этом уроке я поделюсь с вами сниппетом, который я использовал в одном из своих проектов ещё год назад. А делает он вот что:

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

Для настройки динамических цен есть целый вагон плагинов, в основном платных. Скажу прямо – я их не тестировал, вполне возможно, что среди них есть хорошие, но это не точно.

Итак, код для functions.php текущей или дочерней темы:

add_action( 'woocommerce_before_calculate_totals', 'truemisha_quantity_based_price' );
 
function truemisha_quantity_based_price( $cart_object ) {
 
 	// вообще всегда можно сделать print_r( $cart_object ); exit; если что-то не ясно
 
	$product_id = 35; // целевой ID товара с динамической ценой
 
	// тут необязательно крутить foreach, но я вот решил сделать так
	foreach ( $cart_object->get_cart() as $cart_id => $cart_item ) {
 
		if( $cart_item[ 'product_id' ] == $product_id ) {
			$quantity = $cart_item[ 'quantity' ];
			break;
		}
 
	}
 
	// если количество товара больше трёх, можно задать любое своё значение
	if( ! empty( $quantity ) && $quantity > 3 ) {
 
		// опять цикл, да
		foreach ( $cart_object->get_cart() as $cart_id => $cart_item ) {
 
			// если нужный товар
			if( $cart_item['product_id'] == $product_id ) {
 
				// я решил сделать скидку 50%
				$newprice = $cart_item['data']->get_regular_price() / 2;
 
				$cart_item['data']->set_price( $newprice );
 
			}
 
		}
	}
 
}

И как обычно, немного комментариев к коду.

  • На строке 9 я упомянул, что не обязательно крутить foreach() – в целом да, в не древних версиях WooCommerce можно попробовать воспользоваться методом generate_cart_id() и сразу обратиться к нужному товару в массиве корзины, есть примерный пример тут.
  • Помимо проверки на ID товара, вы можете например чекать категории товаров методом get_category_ids().

Если вам нелегко даётся WooCommerce, но вы очень хотите в нём разобраться, то рекомендую вам мой видеокурс! 🚀

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

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

Комментирование этого поста более не доступно.
  • Гога 23 апреля 2020 #

    Спасибо, полезно, как впрочем и всегда)

  • Владислав 23 апреля 2020 #

    Спасибо большое! В дальнейшем меня ваш код очень выручит!

  • Миша 23 апреля 2020 #

    Всегда пожалуйста 🙃

  • Александр 15 июля 2020 #

    Добрый день интересная статься, у Вас скидка 50% если больше трех позиций, а как сделать скидку 70% если товаров пример больше 15шт

  • Александр 15 июля 2020 #

    мой первый комментарии не совсем коректно был написан, мне интересно как сделать что если больше 3шт то / 2 (т.е 50%), если написать = 100, то цена будет 100р, верно?
    И в этом же товаре можно сделать что бы если 3шт то цена одна, а когда 10 шт то цена другая или надо создавать такой же скрипт где указать новые параметры, хотелось бы в одном как то реализовать эти параметры. Это возможно?

    • Миша 17 июля 2020 #

      Добрый день,

      Вы можете накидать условий сюда:

      if( $quantity > 3 && $quantity < 10 ) {
       
      } elseif( $quantity >= 10 ) {
       
      }
      • Александр 20 июля 2020 #

        Спасибо! А цену как поставить точную ($newprice = $cart_item['data']->get_regular_price() во тут 100;), если ставлю "+ 100","- 100","* 100"," / 100" - все работает без проблем, но есть ставлю "= 100" пишет ошибку

        • Миша 20 июля 2020 #

          Александр, ==

          🙂

          • Александр 20 июля 2020 #

            Спасибо, Миша))) читай твой блог, смотрел другие примеры твоих работ, пробовал: !== !=, ну и == и все получилось, но все равно спасибо за ответ )

            • Александр 23 июля 2020 #

              после чистки кэша пишет ошибку если ставлю == цена после 3 шт. идет не та которую задаю == 150, а ноль почему то

            • Миша 23 июля 2020 #

              интересно. а что за ошибка?

  • Дмитрий 3 августа 2020 #

    Добрый день, Михаил. Спасибо за ценную информацию.
    а можно вместо забитых вручную цифр поставить переменную из acf ?
    тобиж вместо скидки просто поставить
    $new_price = get_field( "wholesale_price");

    когда подставляю эту переменную не работает ничего ..(

    • Миша 4 августа 2020 #

      Добрый день!

      Скорее всего да, но с этим плагином я предпочитаю не работать, поэтому ничего вам не подскажу 🙃

    • GG 30 августа 2020 #

      $new_price = get_field( "wholesale_price");
      ->
      $new_price = get_post_meta( $post->ID, 'wholesale_price', true );

  • Roman 20 сентября 2020 #

    Миша Добрый День, просьба помочь с вашей функцией для моей задачи
    Логика акции “Бутыль в подарок”: предварительно надо проверить, что минимально возможное кол-во бутылей 19л в Корзине равно двум, затем вычесть стоимость одной бутыли из суммы заказа. Таких три товара