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

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

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

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

ההנחה הכמותית לא חייבת להיות בעניין של רכישה מעל ל-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 ולאפשר לבעל החנות לשלוט בצורה דינאמית על רמות ההנחה מבלי להתעסק בקוד.

    כתיבת תגובה

    1. משה

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

      הגב
      1. דור צוברי

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

      2. משה

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

      3. דור צוברי

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

    2. נתנאל

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

      הגב
      1. דור צוברי

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

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

    3. עמרי שילה

      היי תודה רבה על הכתבה ועל האתר שלך בכלל…
      אם אני רוצה לבצע הנחה שונה לכל מוצר אז אני צריך להטמיע את הקוד כמה פעמים וכל פעם לשנות את הid ואת האחוזי הנחה??
      תודהה מראש
      ועוד פעםם תותח:)

      הגב
      1. דור צוברי

        היי עמרי,
        תודה רבה, שמח לשמוע 🙂 מזמין אותך להירשם לעדכונים, בקרוב יעלו מאמרים חדשים 🙂

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

    4. הדר סזנה

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

      הגב
      1. דור צוברי

        היי הדר,
        שמח לשמוע שאת נהנית מתכני האתר 🙂

        את יכולה להוריד תוספים כמו Booster ולהגדיר הנחה גלובלית על האתר.

    5. אלדד

      ראשית – כתבה מעולה ומאוד ידידותית בזכות ההסברים.

      האם אתה מכיר פלאגין, (או קוד) להוספת "10% על המוצר השני", כאשר המוצר השני יכול להיות אותו הפריט או פריט אחר?

      הגב
      1. דור צוברי

        היי אלדד,
        תודה רבה, שמח לשמוע! 🙂

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

    6. מירי

      היי דור
      המאמרים שלך מעולים ומועילים…
      אולי תוכל לכוון אותי איך ליצור חבילות רכישה
      שהקונה יכול בהמשך לרכוש עוד מוצרים ללא עלות עד שמנצל את כל החבילה
      תודה

      הגב
      1. דור צוברי

        היי מירי,
        תודה רבה, שמח לראות שאת נהנת מהמדריכים באתר 🙂

        אני לא חושב שהבנתי בדיוק מה הכוונה בשאלה שלך, אם תוכלי לחדד אני אשמח 🙂

    7. רוב

      מאמר יפה, איך אפשר לעשות הנחה על מוצר שני כשני ששני המוצרים מאותה קטגוריה?

      הגב
      1. דור צוברי

        היי רוב,
        בהחלט אפשרי, צריך טיפה לדעת PHP בשביל לאפשר את זה.

    8. מרים

      תודה על המאמר.
      האם יש אפשרות על ידי קוד ליצור הנחה שונה לכל מוצר?

      הגב
      1. דור צוברי

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

    9. רוב

      מאמר יפה,
      אתה מכיר תוסף טוב למבצעים שעושות הנחות מורכבות וקל להפעלה?

      הגב
      1. דור צוברי

        אהלן רוב 👋,
        יש המון תוספים מעולים, אני ממליץ לך לבדוק את Booster.

    10. כפיר

      היי תודה רבה על המידע
      האם יש לך מושג איך אפשר להכין קופון שישפיע על המחיר אחרי הנחה של קופון אחר? ואל ישפיע על סה"כ העגלה לפני הפעלת קופנים?
      תודה

      הגב
      1. דור צוברי

        היי כפיר 👋,
        למיטב זכרוני, אין אפשרות כזאת מובנת, אולי שווה להשתמש בתוסף לקופונים כלשהו.

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

    שתפו