Language EN
חיפוש

הוספה אוטומטית של מוצרים לעגלת הקניות באמצעות קישור

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

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

$product_id = XX;
$url = esc_url_raw( add_query_arg( 'add-to-cart', $product_id, wc_get_checkout_url() ) );

מה שנשאר לכם לעשות הוא להדפיס את המשתנה $url בתוך href כלשהו והנה לכם קישור לעמוד התשלום אשר מוסיף את מוצר XX לעגלה בצורה אוטומטית.

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

הוספת מספר מוצרים במקביל לעגלה

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

function woocommerce_add_multiple_products_to_cart( $url = false ) {
	// Make sure WC is installed, and add-to-cart query arg exists, and contains at least one comma.
	if ( ! class_exists( 'WC_Form_Handler' ) || empty( $_REQUEST['add-to-cart'] ) || false === strpos( $_REQUEST['add-to-cart'], ',' ) ) {
		return;
	}

	// Remove WooCommerce's hook, as it's useless (doesn't handle multiple products).
	remove_action( 'wp_loaded', array( 'WC_Form_Handler', 'add_to_cart_action' ), 20 );

	$product_ids = explode( ',', $_REQUEST['add-to-cart'] );
	$count       = count( $product_ids );
	$number      = 0;

	foreach ( $product_ids as $id_and_quantity ) {
		// Check for quantities defined in curie notation (<product_id>:<product_quantity>)
		// https://dsgnwrks.pro/snippets/woocommerce-allow-adding-multiple-products-to-the-cart-via-the-add-to-cart-query-string/#comment-12236
		$id_and_quantity = explode( ':', $id_and_quantity );
		$product_id = $id_and_quantity[0];

		$_REQUEST['quantity'] = ! empty( $id_and_quantity[1] ) ? absint( $id_and_quantity[1] ) : 1;

		if ( ++$number === $count ) {
			// Ok, final item, let's send it back to woocommerce's add_to_cart_action method for handling.
			$_REQUEST['add-to-cart'] = $product_id;

			return WC_Form_Handler::add_to_cart_action( $url );
		}

		$product_id        = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $product_id ) );
		$was_added_to_cart = false;
		$adding_to_cart    = wc_get_product( $product_id );

		if ( ! $adding_to_cart ) {
			continue;
		}

		$add_to_cart_handler = apply_filters( 'woocommerce_add_to_cart_handler', $adding_to_cart->get_type(), $adding_to_cart );

		// Variable product handling
		if ( 'variable' === $add_to_cart_handler ) {
			woo_hack_invoke_private_method( 'WC_Form_Handler', 'add_to_cart_handler_variable', $product_id );

			// Grouped Products
		} elseif ( 'grouped' === $add_to_cart_handler ) {
			woo_hack_invoke_private_method( 'WC_Form_Handler', 'add_to_cart_handler_grouped', $product_id );

			// Custom Handler
		} elseif ( has_action( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler ) ){
			do_action( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler, $url );

			// Simple Products
		} else {
			woo_hack_invoke_private_method( 'WC_Form_Handler', 'add_to_cart_handler_simple', $product_id );
		}
	}
}

// Fire before the WC_Form_Handler::add_to_cart_action callback.
add_action( 'wp_loaded', 'woocommerce_add_multiple_products_to_cart', 15 );


/**
  Invoke class private method

 * @since   0.1.0
 *
 * @param   string $class_name
 * @param   string $methodName
 *
 * @return  mixed
 */
function woo_hack_invoke_private_method( $class_name, $methodName ) {
	if ( version_compare( phpversion(), '5.3', '<' ) ) {
		throw new Exception( 'PHP version does not support ReflectionClass::setAccessible()', __LINE__ );
	}

	$args = func_get_args();
	unset( $args[0], $args[1] );
	$reflection = new ReflectionClass( $class_name );
	$method = $reflection->getMethod( $methodName );
	$method->setAccessible( true );

	$args = array_merge( array( $class_name ), $args );
	return call_user_func_array( array( $method, 'invoke' ), $args );
	}

הקוד שלמעלה נכתב במקור כאשר PHP 5.3 היה עדכני. ווקומרס דורשת כיום PHP 7.4 לפחות (8.3 מומלץ), כך שבדיקת גרסת ה-PHP בתוך woo_hack_invoke_private_method כבר לא רלוונטית. כמו כן, יש לציין שקטע קוד זה משתמש ב-PHP Reflection כדי לגשת למתודות פרטיות של ווקומרס, מה שאומר שהוא עלול להישבר לאחר עדכון ווקומרס אם מתודות פנימיות אלו משתנות. בדקו היטב לאחר כל שדרוג של ווקומרס.

הוסיפו קוד זה לקובץ functions.php בתבנית הבת שלכם ולאחר מכן תוכלו להוסיף מוצרים לעגלה באמצעות הקישורים הבאים:

// Multiple products, multiple quantities per product.
$product_ids = '53:2,68:4';
$add_to_cart_url = esc_url_raw( add_query_arg( 'add-to-cart', $product_ids, wc_get_checkout_url() ) );

// Multiple products (default quantity of 1)
$product_ids = '53,68';
$add_to_cart_url = esc_url_raw( add_query_arg( 'add-to-cart', $product_ids, wc_get_checkout_url() ) );

// Normal add-to-cart URL
$product_ids = '53';
$add_to_cart_url = esc_url_raw( add_query_arg( 'add-to-cart', $product_ids, wc_get_checkout_url() ) );

בשורה 2 למשל, קבענו כי הקישור יוסיף לעגלת הקניות שתי יחידות של מוצר עם מזהה 53 וארבע יחידות של מוצר עם מזהה 68. הפורמט הוא product_id:quantity, מופרד בפסיקים.

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

למקרים פשוטים בהם אתם צריכים להוסיף מוצר בודד בלבד, אפשר לדלג על הפונקציה המותאמת לחלוטין ולבנות את הכתובת ישירות: https://yoursite.com/checkout/?add-to-cart=PRODUCT_ID. ווקומרס מטפלת בכתובות הוספה לעגלה עבור מוצר בודד באופן מובנה ללא קוד נוסף.

כתובות Checkout שיתופיות מובנות (ווקומרס 10.0+)

החל מווקומרס 10.0 (שוחרר ביולי 2025), קיימת דרך מובנית ליצור קישורי הוספה לעגלה שתומכים במספר מוצרים, כמויות, ואפילו קודי קופון אוטומטיים. ווקומרס קוראת לפיצ'ר זה Shareable Checkout URLs.

פורמט הכתובת משתמש בנקודת הקצה /checkout-link/:

https://yourstore.com/checkout-link/?products=53:2,68:4&coupon=SPRING10

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

אם החנות שלכם מריצה ווקומרס 10.0 ומעלה, מומלץ להשתמש בנקודת הקצה המובנית /checkout-link/ במקום הפונקציה המותאמת שמופיעה מוקדם יותר בפוסט זה. היא אמינה יותר, לא דורשת קוד מותאם, ותומכת בקופונים באופן מובנה.

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

שאלות נפוצות

שאלות נפוצות בנושא הוספת מוצרים לעגלת הקניות של ווקומרס באמצעות קישור:

האם ניתן להוסיף מוצר לעגלה בלי להפנות לעמוד התשלום?
כן. החליפו את wc_get_checkout_url() ב-wc_get_cart_url() בקוד בניית הכתובת. פעולה זו תשלח את המשתמש לעמוד עגלת הקניות במקום לעמוד התשלום לאחר הוספת המוצר.
האם ווקומרס תומכת בהוספת מספר מוצרים באמצעות כתובת URL באופן מובנה?
החל מווקומרס 10.0 (יולי 2025), כן. נקודת הקצה /checkout-link/ תומכת במספר מוצרים בפורמט ?products=ID:QTY,ID:QTY. עבור גרסאות ווקומרס ישנות יותר, רק מזהה מוצר בודד מעובד כברירת מחדל, ויש צורך בקוד מותאם כמו הפונקציה המוצגת בפוסט זה.
האם שיטה זו עובדת עם מוצרים משתנים (variable products)?
הפונקציה מטפלת במוצרים משתנים על ידי זיהוי סוג המוצר וקריאה ל-handler המתאים של ווקומרס. עם זאת, עבור מוצרים משתנים יש לציין בדרך כלל את מזהה הווריאציה (variation ID) ולא את מזהה המוצר הראשי כדי להבטיח שהווריאציה הנכונה מתווספת לעגלה.
האם הקוד עלול להישבר לאחר עדכון ווקומרס?
ייתכן. הפונקציה משתמשת ב-PHP Reflection כדי לגשת למתודות פרטיות של ווקומרס, מה שהופך אותה תלויה במבנה הפנימי של ווקומרס. אם ווקומרס תשנה שם או תסיר את המתודות הפרטיות הללו בעדכון עתידי, הקוד יישבר. יש לבדוק תמיד לאחר עדכון ווקומרס.
איך מוצאים את מזהה המוצר (Product ID) בווקומרס?
היכנסו ל-Products בפאנל הניהול של וורדפרס והעבירו את העכבר מעל כל מוצר. מזהה המוצר מופיע בכתובת ה-URL שבשורת המצב של הדפדפן, או שניתן לראות אותו בעמודת ה-ID אם היא מופעלת. ניתן למצוא אותו גם במסך עריכת המוצר בכתובת ה-URL כ-post=PRODUCT_ID.

לסיכום

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

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

דיון ותגובות
12 תגובות  ]
  • רוב 18 ספטמבר 2017, 11:36

    יפה מאוד.

  • אסף 5 דצמבר 2018, 10:18

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

  • מאיר 7 ספטמבר 2020, 13:06

    איך בדיוק אני עושה את זה?

  • גדי 11 יולי 2021, 0:16

    סליחה על הבורות. האם זהו קוד HTML להוספה לכפתור? איפה מוסיפים HREF? האם אין לינק כלשהו שרק יוסיף את המוצר לסל? שהרי ב- CALL TO ACTION של אלמנטור יש אפשרות להכניס לינק ולא שורת קוד.

    תודה

  • רועי יוסף 11 יולי 2021, 1:10

    היי גדי,

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

    $product_id = XX;
    $url = esc_url_raw( add_query_arg( 'add-to-cart', $product_id, wc_get_checkout_url() ) );

    עלייך להוסיף את ה HTML הבא היכן שתרצה להוסיף קישור להוספצ המוצר לעגלה:

    echo '<a href="'. $url .'">Link</a>';

    מקווה שזה ברור יותר…

  • דבורה 27 אוקטובר 2021, 12:40

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

    • רועי יוסף 27 אוקטובר 2021, 22:57

      היי דבורה,

      נסי את זה ואמרי אם עובד לך… (קובץ functions.php):

      /**
       * Changes the redirect URL for the Return To Shop button in the cart.
       *
       * @return string
       */
      function wc_empty_cart_redirect_url() {
      	return 'https://mywebsite.co.il/sample-page/';
      }
      add_filter( 'woocommerce_return_to_shop_redirect', 'wc_empty_cart_redirect_url' );
  • דבורה 28 אוקטובר 2021, 0:05

    יששששש
    עבד מעולה!
    איזה כיף שאתה עוזר
    תודה רבה…

  • חיים 4 יוני 2024, 17:39

    אני רוצה להוסיף לעגלת הקניות/עמוד תשלום שדות מותאמים אישית במטא ג'ט שהוספתי למוצרים/עמוד מוצר

    ונתונים שנשמרו בלידים של אלמנטור ע"י טופס

    יש לך אולי קוד

    • רועי יוסף 4 יוני 2024, 18:09

      היי חיים, לא יכול לעזור במקרה הזה, בהצלחה!

  • אבי 5 דצמבר 2024, 17:20

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

השאירו תגובה

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

Savvy WordPress Development official logo