做基于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。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
您也可以扫描左边的二维码,关注我们的微信公众号,在微信上查看我们的案例。