Статьи

Установка минимальных требований к оформлению заказа в WooCommerce

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

  • Установка минимального веса для заказа
  • Установка минимального количества продуктов, необходимых для заказа
  • Установка минимального количества на продукт
  • Установка минимальной суммы в долларах за заказ

Методы, используемые в этой статье

В WooCommerce всегда есть несколько способов установить минимальные требования; результаты могут быть даже идентичны. Но я считаю, что методы, описанные ниже, являются правильным (или лучшим) способом сделать это. Любые предложения по выполнению этих задач или дальнейших улучшений всегда приветствуются и принимаются хорошо.

Следующий код был протестирован в последних версиях, доступных для WordPress (3.9.1) и WooCommerce (2.1.12). Мы будем использовать фиктивные данные, предоставленные для WooCommerce, при установке плагина. Код должен находиться в файле functions.php вашей темы и тщательно комментироваться, поэтому его легче отслеживать и / или изменять при необходимости.

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

Установка минимального веса для заказа

Ограничение по весу

Часто бывает полезно ограничить ваших клиентов от завершения процесса оформления заказа, не выполнив требования минимального веса. Требования к минимальному весу могут помочь сделать ваши расходы на доставку более управляемыми, а процесс доставки — более рациональным. Не забудьте изменить минимальный вес на тот, который вам больше подходит, и имейте в виду, что вес рассчитывается в любой единице веса, которую вы установили в разделе WooCommerce -> Настройки -> Продукты.

 // Set a minimum weight requirement before checking out
add_action( 'woocommerce_check_cart_items', 'spyr_set_weight_requirements' );
function spyr_set_weight_requirements() {
	// Only run in the Cart or Checkout pages
	if( is_cart() || is_checkout() ) {
		global $woocommerce;
		// Set the minimum weight before checking out
		$minimum_weight = 25;
		// Get the Cart's content total weight
		$cart_contents_weight = WC()->cart->cart_contents_weight;
		// Compare values and add an error is Cart's total weight
	    // happens to be less than the minimum required before checking out.
		// Will display a message along the lines of
		// A Minimum Weight of 25kg is required before checking out. (Cont. below)
		// Current cart weight: 12.5kg
		if( $cart_contents_weight < $minimum_weight  ) {
			// Display our error message
			wc_add_notice( sprintf('<strong>A Minimum Weight of %s%s is required before checking out.</strong>'
				. '<br />Current cart weight: %s%s',
				$minimum_weight,
				get_option( 'woocommerce_weight_unit' ),
				$cart_contents_weight,
				get_option( 'woocommerce_weight_unit' ),
				get_permalink( wc_get_page_id( 'shop' ) )
				),
			'error'	);
		}
	}
}

Установка минимального количества продуктов, необходимых для заказа

Количество продуктов на заказ

Другой допустимый сценарий — установка минимального количества продуктов, которые необходимо заказывать за один раз, прежде чем позволить клиенту полностью оплатить его заказ и его доставку. Измените «20» на то, что лучше всего подходит для ваших нужд. Как и в предыдущем примере, вы хотите убедиться, что этот код запускается только на страницах корзины и оформления заказа. Это то, что мы используем is_cart () и is_checkout (), которые возвращают true, когда мы находимся на этих двух конкретных страницах. Узнайте больше об условных тегах WooCommerce .

 // Set a minimum number of products requirement before checking out
add_action( 'woocommerce_check_cart_items', 'spyr_set_min_num_products' );
function spyr_set_min_num_products() {
	// Only run in the Cart or Checkout pages
	if( is_cart() || is_checkout() ) {
		global $woocommerce;

		// Set the minimum number of products before checking out
		$minimum_num_products = 20;
		// Get the Cart's total number of products
		$cart_num_products = WC()->cart->cart_contents_count;

		// Compare values and add an error is Cart's total number of products
	    // happens to be less than the minimum required before checking out.
		// Will display a message along the lines of
		// A Minimum of 20 products is required before checking out. (Cont. below)
		// Current number of items in the cart: 6	
		if( $cart_num_products < $minimum_num_products ) {
			// Display our error message
	        wc_add_notice( sprintf( '<strong>A Minimum of %s products is required before checking out.</strong>' 
	        	. '<br />Current number of items in the cart: %s.',
	        	$minimum_num_products,
	        	$cart_num_products ),
	        'error' );
		}
	}
}

Установка минимального количества на продукт

Количество на продукт

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

Чтобы установить эти ограничения, вам нужно создать массив, содержащий ваши правила / ограничения внутри другого массива. Будьте осторожны при редактировании этого массива и убедитесь, что весь код введен точно, чтобы избежать ошибок и неожиданных результатов. Формат, который вам нужно использовать, следующий:

 // Product Id and Min. Quantities per Product
// id = Product ID
// min = Minimum quantity
$product_min_qty = array( 
	array( 'id' => 47, 'min' => 100 ),
	array( 'id' => 37, 'min' => 100 ),
	array( 'id' => 34, 'min' => 100 ),
	array( 'id' => 31, 'min' => 100 ),
);

Здесь происходит волшебство.

 // Set minimum quantity per product before checking out
add_action( 'woocommerce_check_cart_items', 'spyr_set_min_qty_per_product' );
function spyr_set_min_qty_per_product() {
	// Only run in the Cart or Checkout pages
	if( is_cart() || is_checkout() ) {	
		global $woocommerce;

		// Product Id and Min. Quantities per Product
		$product_min_qty = array( 
			array( 'id' => 47, 'min' => 100 ),
			array( 'id' => 37, 'min' => 100 ),
			array( 'id' => 34, 'min' => 100 ),
			array( 'id' => 31, 'min' => 100 ),
		);

		// Will increment
		$i = 0;
		// Will hold information about products that have not
		// met the minimum order quantity
		$bad_products = array();

		// Loop through the products in the Cart
		foreach( $woocommerce->cart->cart_contents as $product_in_cart ) {
			// Loop through our minimum order quantities per product
			foreach( $product_min_qty as $product_to_test ) {
				// If we can match the product ID to the ID set on the minimum required array
				if( $product_to_test['id'] == $product_in_cart['product_id'] ) {
					// If the quantity required is less than than the quantity in the cart now
					if( $product_in_cart['quantity'] < $product_to_test['min'] ) {
						// Get the product ID
						$bad_products[$i]['id'] = $product_in_cart['product_id'];
						// Get the Product quantity already in the cart for this product
						$bad_products[$i]['in_cart'] = $product_in_cart['quantity'];
						// Get the minimum required for this product
						$bad_products[$i]['min_req'] = $product_to_test['min'];
					}
				}
			}
			// Increment $i
			$i++;
		}

		// Time to build our error message to inform the customer
		// About the minimum quantity per order.
		if( is_array( $bad_products) && count( $bad_products ) > 1 ) {
			// Lets begin building our message
			$message = '<strong>A minimum quantity per product has not been met.</strong><br />';
			foreach( $bad_products as $bad_product ) {
				// Append to the current message
				$message .= get_the_title( $bad_product['id'] ) .' requires a minimum quantity of '
						 . $bad_product['min_req'] 
						 .'. You currently have: '. $bad_product['in_cart'] .'.<br />';
			}
			wc_add_notice( $message, 'error' );
		}
	}
}

Установка минимальной суммы в долларах за заказ

Минимальная сумма за заказ

И последнее, но не менее важное: вы можете установить минимальную сумму в долларах, которая должна быть потрачена до того, как ваш клиент сможет оформить заказ. Обратите внимание, что мы рассчитываем общую стоимость с использованием промежуточной суммы, прежде чем доставка и налоги будут добавлены к итоговой сумме заказа.

 // Set a minimum dollar amount per order
add_action( 'woocommerce_check_cart_items', 'spyr_set_min_total' );
function spyr_set_min_total() {
	// Only run in the Cart or Checkout pages
	if( is_cart() || is_checkout() ) {
		global $woocommerce;

		// Set minimum cart total
		$minimum_cart_total = 10;

		// Total we are going to be using for the Math
		// This is before taxes and shipping charges
		$total = WC()->cart->subtotal;
		
		// Compare values and add an error is Cart's total
	    // happens to be less than the minimum required before checking out.
		// Will display a message along the lines of
		// A Minimum of 10 USD is required before checking out. (Cont. below)
		// Current cart total: 6 USD 
		if( $total <= $minimum_cart_total  ) {
			// Display our error message
			wc_add_notice( sprintf( '<strong>A Minimum of %s %s is required before checking out.</strong>'
				.'<br />Current cart\'s total: %s %s',
				$minimum_cart_total,
				get_option( 'woocommerce_currency'),
				$total,
				get_option( 'woocommerce_currency') ),
			'error' );
		}
	}
}

Вывод

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

Спасибо за чтение, комментарии и предложения о том, как улучшить код, всегда приветствуются. Если у вас есть идеи для конкретной модификации WooCommerce, не стесняйтесь и оставьте ссылку на нее в комментариях для обсуждения.