מידי פעם אני רואה בקבוצות השונות שאנשים שואלים על הנחה כמותית, איך לתת הנחה בצורה דינאמית לפי רמות שונות של כמות המוצר אשר נמצא בעגלה. לרוב פיצ׳ר זה חשוב לחנויות אשר מוכרות בצורה סיטונאית, אך זה מתאים גם לבעלי חנויות אשר מעוניינים לגרום לאנשים לרכוש יותר מאותו המוצר.

במאמר זה נלמד כיצד לכתוב קוד אשר יאפשר לנו לתת הנחה כמותית ללקוח אשר רוכש יותר מכמות אחת מאותו המוצר, לפי דרגות הנחה שונות אשר מוגדרות לפי טווח.

לוגו של טלגרם הצטרפו לערוץ הטלגרם וקבלו עדכון כאשר מאמר חדש מתפרסם!

כתיבת הקוד

בתור התחלה עלינו לכתוב את הקוד הרלוונטי, לכן, אנו נפתח את קובץ הפונקציות של התבנית שלנו (functions.php) ונדביק את הקוד הבא בסופו. שימו לב שמומלץ לבצע שינויים בקוד ולהתאים אותם לצרכים שלכם.

/**
 * Apply bulk pricing for products in cart.
 *
 * @param WC_Cart $cart WooCommerce cart object.
 */
function dorzki_bulk_pricing_products( $cart ) {

	// Discount quantity levels.
	$levels = array_reverse( [
		[
			'min' => 5,
			'max' => 9,
			'discount' => 3
		],
		[
			'min' => 10,
			'max' => 19,
			'discount' => 7
		],
		[
			'min' => 20,
			'max' => 49,
			'discount' => 15
		],
		[
			'min' => 50,
			'max' => 9999,
			'discount' => 20
		]
	] );

	// Loop products and apply discount.
	foreach( $cart->get_cart_contents() as $product_item ) {

		foreach( $levels as $level ) {

			// Validate array.
			$validate = [
				'options' => [
					'min_range' => $level[ 'min' ],
					'max_range' => $level[ 'max' ]
				]
			];

			// Check discount range.
			if( filter_var( $product_item[ 'quantity' ], FILTER_VALIDATE_INT, $validate ) ) {

				$new_price = $product_item[ 'data' ]->get_price() * floatval( 1 - ( $level[ 'discount' ] / 100 ) );

				$product_item[ 'data' ]->set_price( $new_price );

				break;

			}

		}

	}

}

add_action( 'woocommerce_calculate_totals', 'dorzki_bulk_pricing_products' );

הסבר על הקוד

בתור התחלה אנחנו מגדירים את הגדרת ההנחה, אנחנו מגדירים מערך דו מימדי אשר מכיל את ההגדרות עבור רמות ההנחה השונות. כל מערך כולל 3 שדות – מינימום כמות (min), מקסימום כמות (max) ואחוז הנחה (discount). לאחר מכן אנו הופכים את סדר המערך, אנו עושים זאת מכיוון שאנחנו רוצים לתת הנחה לפי הכמות של המוצר, במידה ולא היינו הופכים את המערך, מה שהיה קורה זה שבמידה וכמות המוצר הייתה ברמה השנייה, אז היה כפל הנחה – הנחה של רמה 1 + הנחה של רמה 2 וכד׳.

רמות ההנחה שהגדרנו בקוד הם:

טווח הנחהאחוז הנחה
בין 5 ל-9 מוצרים3% הנחה
בין 10 ל-19 מוצרים7% הנחה
בין 20 ל-49 מוצרים15% הנחה
החל מ-50 מוצרים (מוגבל עד 9999)20% הנחה

לאחר שאנחנו מגדירים את רמות ההנחה השונות, אנחנו רצים על כל המוצרים אשר קיימים בעגלה, ומשתמשים בפונקציה filter_var על מנת לבדוק האם הכמות בעגלה של המוצר הנוכחי תואמת לאחת מהרמות הנחה, כאשר הכמות נמצאת בטווח מסויים, אנו מבצעים חישוב מחדש של המוצר לאחר ההנחה וממשיכים למוצר הבא.

ההנחה חלה עבור כל מוצר בפני עצמו, לא מתבצעת פה הנחה כוללת לפי כמות המוצרים בכל העגלה, אלא עבור כל מוצר בפני עצמו.

סיכום

הנחה כמותית הינו פיצ׳ר חשוב כאשר החנות הינה חנות סיטונאית, או כאשר מעוניינים לעודד רכישה של יותר ממוצר אחד. ע״י שימוש בתוסף Advanced Custom Fields ודומיו, ניתן לבצע התאמה של הקוד ולאפשר עריכה של רמות ההנחה דרך ממשק ניהול נוח, ואף לבצע הגדרה שונה עבור כל אחד מהמוצרים ככה שיהיה ניתן לתת יותר כוח לבעל החנות.

דור צוברי

מתכנת מגיל 13, ומתעסק עם וורדפרס מגיל 18, אוהב לפצח אתגרים ולפתח דברים מורכבים על בסיס וורדפרס. עצמאי מגיל 16, מרצה ובלוגר. בזמן הפנוי שלי אוהב מאוד לקרוא קומיקס של MARVEL.

דור צוברי

תגובות לפוסט

כתיבת תגובה

תגובה אחת

  1. נתנאל

    בחישוב לפי מוצר זה עובד –
    אבל יש בעיה בסיכום של עגלת הקניות…..

    1. מחבר
      דור צוברי

      היי נתנאל,
      נשמע לי לא הגיוני, כי הפונקציה רצה לפני החישוב הסופי, ומבדיקה שעשיתי הקוד עובד תקין במספר חנויות.

      נסה לעשות את זה על Session חדש לגמרי, כנס ממצב מוסתר, הוסף מוצר אחד לעגלה ותראה אם מסתדר לך.

  2. משה

    איפה אפשר להגדיר את המוצר הספציפי שעליו אני רוצה לתת את ההנחה ?

    1. מחבר
      דור צוברי

      אתה יכול לבדוק לפי מזהה המוצר $product_item[ 'data' ]->get_id().