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

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

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

הנחה כמותית כאמצעי להעלאת מחירות

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

ההנחה הכמותית לא חייבת להיות בעניין של רכישה מעל ל-10 מוצרים או יותר, אלא יכולה להיות גם על רכישה של 2 מוצרים.

הרבה חנויות בחו״ל נותנות הנחה כמותית עבור רכישה של אותו המוצר, חנויות כגון Steam, Ebay וכד׳.
אם נקח לדוגמא את Steam, חנות משחקי המחשב הדיגיטלית הגדולה בעולם, חלק מהמשחקים שם נמכרים בחבילת ״Play with Friends״.
חבילה זאת מאפשרת לך לקנות את המשחק לעצמך ולעוד 3 חברים את המשחק בהנחה.

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

בניית מנגנון הנחה כמותית

בניית מנגנון הנחה כמותית הינו פשוט מאוד וכולל קוד של מספר שורות מצומצם.
יש לפתוח את קובץ הפונקציות של התבנית שלנו 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_before_calculate_totals', 'dorzki_bulk_pricing_products' );

הסבר מעמיק של הקוד

הקוד מוגדר לרוץ ממש לפני שווקומרס מחשבת את סכום ההזמנה ע״י שימוש בהוק woocommerce_before_calculate_totals.

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

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

בקוד שלנו הגדרנו מספר רמות הנחה שונות:

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

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

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

עלות מוצר חדשה = עלות מוצר ישנה * ( 1 – ( אחוז ההנחה / 100 ) )

לדוגמא, אם המוצר שלנו עולה 50 ש״ח, והוספנו את המוצר לעגלה עם כמות של 6, החישוב יהיה:

עלות מוצר חדשה = 50 * ( 1 – ( 3 / 100 ) = 48.5

צילום מסך של עמוד עגלה עם הנחה כמותית למוצר

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

הצגת הנחה כמותית ברמת עגלה

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

/**
 * 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
		]
	] );

	$discount = 0;

	// 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 ) ) {

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

				break;

			}

		}

	}

	if( $discount ) {

		$cart->add_fee( __( 'Bulk Discount', 'dorzki' ), -$discount, false );

	}

}

add_action( 'woocommerce_before_calculate_totals', 'dorzki_bulk_pricing_products' );

הסבר מעמיק של הקוד

דוגמא זו דומה לדוגמא הקודמת אך עם מספר שינויים קלים אשר עושים את ההבדל הגדול.

אנחנו מגדירים משתנה חדש אשר יכיל את ההנחה המצטברת – $discount.
כאשר כמות אחד המוצרים עונה על אחד מהטווחים של ההנחה הכמותית, אנו מבצעים חישוב שונה, אשר תפקידו יעזור לנו לחלץ את ההנחה.

הנחה כמותית = ( עלות מוצר * ( הנחה / 100 ) * כמות המוצר בעגלה

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

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

צילום מסך של עמוד עגלה עם הנחה כמותית ברמת העגלה

דוגמאות נוספות למנגנון הנחה כמותית

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

עידוד המשתמש להוספת מוצר נוסף לסל

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

הצגת מחירי הנחה כמותית בעמוד מוצר

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

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

הצגת ההנחה הכמותית במחיר יחידה למוצר

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

ניתן לבצע זאת ע״י הוספת עמודה חדשה לטבלה המוצרים, או ע״י הדפסת המחיר אחד מתחת לשני בעמודת מחיר ליחידה.

החלת הנחה כמותית על מוצרים מסויימים

ניתן להתנות את ההנחה כמותית על מוצר אחד או יותר, על קבוצת מוצרים וכד׳.
ע״י שימוש ב-Conditional Tags של ווקומרס ניתן יהיה לבצע זאת בצורה קלה ונוחה.

סיכום

הנחה כמותית הינו פיצ׳ר אשר יכול לשפר את אחוז ההמרות בחנויות שלכם ע״י עידוד הגולש לרכישה של יותר ממוצר אחד.

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

דור צוברי

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

דור צוברי

תגובות לפוסט

כתיבת תגובה

תגובה אחת

  1. נתנאל

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

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

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

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

  2. משה

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

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

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

    2. משה

      $product_item[ 'data' ]->get_id()
      יכול לתת את המיקום המדוייק איפה להכניס את הקוד ?
      למשל ל-ID של מוצר 123 ?

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

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