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

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

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

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

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

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

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

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

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

function woocommerce_add_multiple_products_to_cart( $url = false ) {
	// Make sure WC is installed, and add-to-cart qauery 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 );
	}

הוסיפו קוד זה לקובץ 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() ) );

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

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

לסיכום

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

רעיונות ותגובות יתקבלו בברכה 🙂

רועי יוסף

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

תגובות פייסבוק

{ 1 תגובה… הוסף אחת }

השאירו תגובה

סאבי בלוג
קראו גם את:
פעימות לב וורדפרס
פעימות הלב של וורדפרס – WordPress Heartbeat API

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