WooCommerce微信小程序开发 – 自己写一个购物车查询接口

本站所有文章均为博主人工写作,绝无AI辅助成分,请放心参阅。

做基于WooCommerce的微信小程序,一个绕不开的技术点是需要自己写购物车的接口。WooCommerce至今都没有在自带的Rest API中提供购物车接口,我一直认为这是一个遗憾。

在查了一些资料后,我大致能明白WooCommerce不提供购物车接口的原因,因为大部分的第三方并不需要WooCommerce来提供购物车数据。如果你用WordPress+WooCommerce做后台,开发了一款独立APP,用户可以在APP上完成完整的购物流程,最轻便的做法是不让WooCommerce提供购物车数据,购物车只在APP本身提供即可,WP后台只负责提供商品和订单信息足矣。所以WooCommerce提供的Rest API是足够完成一款普通的第三方应用的需求的。但我们考虑另一种情况,如果你的WooCommerce同时以网站和APP两端提供服务,即同一个用户既能登录网站购物,也能从APP购物,那么你就要考虑购物车的数据同步问题了,要让网站的购物车和APP的购物车同步,我们就不得不需要WooCommerce端有购物车接口了。

这篇博客是对去年写过的一篇“WooCommerce购物车对象使用以及方法函数概括”,进行的一个扩展。在熟悉了购物车一些对象和方法使用后,我们是可以自己写一个购物车接口的。

首先定义一下接口:

1
2
3
4
5
6
7
8
9
10
11
12
add_action('rest_api_init', function(){
	//from: https://blog.brain1981.com
	register_rest_route('wx_app/v1', 'cart', array(
		'methods' => 'GET',
		'callback' => 'brain1981_rest_wc_cart_list',
		'show_in_index' => false,
		'permission_callback' => function ($request) {
			if (current_user_can('read'))
				return true;
		}
	));
});

访问这个接口的地址就是 https://你的域名/wp-json/wx_app/v1/cart, 主要业务代码放在brain1981_rest_wc_cart_list函数中。下面是这个函数的写法:

WooCommerce会把用户的购物车信息放在session中,所以可以从session中获取这些信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
function brain1981_rest_wc_cart_list($request = null) {
	//from: https://blog.brain1981.com
	$user_id = get_current_user_id();
	$session_handler = new WC_Session_Handler(); 
	$session = $session_handler->get_session($user_id); 
	$cart_items = maybe_unserialize($session['cart']);
 
	$resaultsAPI = [];
	if(!is_array($cart_items)){//如果没有物品则直接返回
		return $resaultsAPI;
	}
	foreach( $cart_items as $cart_item_key => $cart_item ) {
		$productID = $cart_item['product_id'];
		$variationID = $cart_item['variation_id'];
 
		if($variationID == 0){ //普通产品
			$thumbnailID = get_post_meta( $productID, '_thumbnail_id', true);
			$attachment = wp_get_attachment_image_src($thumbnailID, 'woocommerce_thumbnail' );
			$product = wc_get_product($productID);
			$stock = $product->get_stock_quantity();
		} else { //可变产品
			$variation = new WC_Product_Variation( $variationID );
			$image_id = $variation->get_image_id();
			$attachment = wp_get_attachment_image_src($image_id, 'woocommerce_thumbnail' );
			$stock = $variation->get_stock_quantity();
		}
		if($attachment){
			$image = $attachment[0];
		} else {
			$image = get_template_directory_uri()."/images/logo.png";
		}
		$product_name = get_the_title($cart_item['product_id']);
 
		//整理影响变量的属性字段,由于购物车只需要显示这些影响价格的变量,所以我重新整理一个数组方便前端输出这些文字
		$attr_arr = [];
		if($variationID){
			$variation = wc_get_product($variationID);
			foreach( $cart_item['variation'] as $key => $value ){
				$tax_slug = str_replace('attribute_','', $key);
				$tax = get_taxonomy( $tax_slug );
				if($tax){
					$tax_name = $tax->labels->name; //exp "name": "产品 尺码",
				}else{
					$tax_name = urldecode($tax_slug);
				}
				$tax_name = str_replace('产品 ','', $tax_name);
				$term = get_term_by('slug', $value, $tax_slug);
				if($term){
					$term_name = $term->name;
				}else{
					$term_name = $value;
				}
				$attr = array(
					'name'=> $tax_name,
					'value' => $term_name
				);
				array_push( $attr_arr, $attr);
			}
		}
		//整理输出的数据
		$api_item = array(
			'product_image' => $image,
			'product_name' => $product_name,
			'product_id'   => $productID,
			'variation_id' => $variationID,
			'quantity'     => $cart_item['quantity'],
			'attributes'   => $attr_arr,
			'item_taxes'   => $cart_item['line_tax_data'],
			'subtotal_tax' => $cart_item['line_subtotal_tax'],
			'total_tax'    => $cart_item['line_tax'],
			'subtotal'     => $cart_item['line_subtotal'],
			'total'        => $cart_item['line_total'],
			'stock' => $stock
		);
		array_push( $resaultsAPI, $api_item);
	}
	return $resaultsAPI;
}

以上方法通过maybe_unserialize($session[‘cart’])这个方法获取购物车数据,但其实WooCommerce还有更好的方法替代它,那就是WC()->cart->get_cart()方法。

提供一个升级版的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
function brain1981_rest_wc_cart_list($request = null) {
	//from: https://blog.brain1981.com
	if ( is_null( WC()->cart ) ) {
		wc_load_cart();
	}
	$cart_items = WC()->cart->get_cart();
	$resaultsAPI = [];
	if( WC()->cart->is_empty() ){//如果没有物品则直接返回
		return $resaultsAPI;
	}
	foreach ( $cart_items as $cart_item_key => $cart_item ) {
		$productID = $cart_item['product_id'];
		$variationID = $cart_item['variation_id'];
 
		if($variationID == 0){ //普通产品
			$thumbnailID = get_post_meta( $productID, '_thumbnail_id', true);
			$attachment = wp_get_attachment_image_src($thumbnailID, 'woocommerce_thumbnail' );
			$product = wc_get_product($productID);
			$stock = $product->get_stock_quantity();
		} else { //可变产品
			$variation = new WC_Product_Variation( $variationID );
			$image_id = $variation->get_image_id();
			$attachment = wp_get_attachment_image_src($image_id, 'woocommerce_thumbnail' );
			$stock = $variation->get_stock_quantity();
		}
		if($attachment){
			$image = $attachment[0];
		} else {
			$image = get_template_directory_uri()."/images/logo.png";
		}
		$product_name = get_the_title($cart_item['product_id']);
 
		//整理影响变量的属性字段
		$attr_arr = [];
		if($variationID){
			$variation = wc_get_product($variationID);
			foreach( $cart_item['variation'] as $key => $value ){
				$tax_slug = str_replace('attribute_','', $key);
				$tax = get_taxonomy( $tax_slug );
				if($tax){
					$tax_name = $tax->labels->name; //exp "name": "产品 尺码",
				}else{
					$tax_name = urldecode($tax_slug);
				}
				$tax_name = str_replace('产品 ','', $tax_name);
				$term = get_term_by('slug', $value, $tax_slug);
				if($term){
					$term_name = $term->name;
				}else{
					$term_name = $value;
				}
				$attr = array(
					'name'=> $tax_name,
					'value' => $term_name
				);
				array_push( $attr_arr, $attr);
			}
		}
 
		$api_item = array(
			'product_image' => $image,
			'product_name' => $product_name,
			'product_id'   => $productID,
			'variation_id' => $variationID,
			'quantity'     => $cart_item['quantity'],
			'attributes'   => $attr_arr,
			'item_taxes'   => $cart_item['line_tax_data'],
			'subtotal_tax' => $cart_item['line_subtotal_tax'],
			'total_tax'    => $cart_item['line_tax'],
			'subtotal'     => $cart_item['line_subtotal'],
			'total'        => $cart_item['line_total'],
			'stock' => $stock
		);
		array_push( $resaultsAPI, $api_item);
	}
	return $resaultsAPI;
}

自此,我们就得到了一个购物车查询接口,可以供微信小程序客户端调用。

本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.brain1981.com/3005.html。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

关注我们的微信公众号-JennyStudio 本站记录了近几年的工作中遇到的一些技术问题和解决过程,“作品集”还收录了本人的大部分作品展示。除了本博客外,我们的工作室网站 – JennyStudio,内有更多作品回顾和展示。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注