WooCommerce 二次开发中,经常会需要对购物车进行改造,甚至有时候会需要重写购物车页面,所以就有必要把 WooCommerce 的购物车提供的接口方法做一下整理。本文对我在最近的一些项目中使用过的方法进行简要的记录。
首先,在调用任何购物车方法之前,先要检查当前页面环境对购物车对象是否可用:
- if ( is_null( WC()->cart ) ) {
- wc_load_cart();
- }
- WC()->cart->get_cart();
常用的条件函数,返回 true/false
- //检查购物车是否有商品
- WC()->cart->is_empty();
- //检查购物车是否需要付费,如果费用为0则返回false
- WC()->cart->needs_payment();
- //检查购物车中是否已经记录收货地址
- WC()->cart->show_shipping();
- //检查是不是需要寄送(用于计算运费的情况)
- WC()->cart->needs_shipping();
- //检查是不是有折扣,如果后台减了价格,这里会返回true
- WC()->cart->has_discount();
获取数据
- /* Author: Brain - blog.brain1981.com */
- //返回购物车商品总数
- WC()->cart->get_cart_contents_count();
- //返回购物车小计
- WC()->cart->get_cart_subtotal();
- //返回总运费
- WC()->cart->get_shipping_total();
- //返回使用的优惠券,返回数组,内容包含优惠券对象和优惠码
- WC()->cart->get_coupons();
- //返回使用的优惠券,返回数组,内容仅包含优惠码
- WC()->cart->get_applied_coupons();
- 返回指定优惠码在当前购物车中获得的折扣金额
- WC()->cart->get_coupon_discount_amount( 'coupon_code' );
- //返回总折扣金额,这俩其实等于同一个方法
- WC()->cart->get_discount_total();
- WC()->cart->get_cart_discount_total();
- //返回购物车总金额,包含了折扣和运费
- WC()->cart->get_total();
- WC()->cart->tota;
获取用户的地址信息
- /* Author: Brain - blog.brain1981.com */
- //获取用户对象
- WC()->cart->get_customer();
- //获取用户的地址信息
- WC()->cart->get_customer()->get_billing_first_name();
- WC()->cart->get_customer()->get_billing_last_name();
- WC()->cart->get_customer()->get_billing_company();
- WC()->cart->get_customer()->get_billing_email();
- WC()->cart->get_customer()->get_billing_phone();
- WC()->cart->get_customer()->get_billing_country();
- WC()->cart->get_customer()->get_billing_state();
- WC()->cart->get_customer()->get_billing_postcode();
- WC()->cart->get_customer()->get_billing_city();
- WC()->cart->get_customer()->get_billing_address();
- WC()->cart->get_customer()->get_billing_address_2();
- WC()->cart->get_customer()->get_shipping_first_name();
- WC()->cart->get_customer()->get_shipping_last_name();
- WC()->cart->get_customer()->get_shipping_company();
- WC()->cart->get_customer()->get_shipping_country();
- WC()->cart->get_customer()->get_shipping_state();
- WC()->cart->get_customer()->get_shipping_postcode();
- WC()->cart->get_customer()->get_shipping_city();
- WC()->cart->get_customer()->get_shipping_address();
- WC()->cart->get_customer()->get_shipping_address_2();
常用方法
- /* Author: Brain - blog.brain1981.com */
- //添加指定的产品到购物车,如果是添加普通产品只需要$product_id和$quantity即可,添加可变产品比较复杂,会另外写博客介绍
- WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation);
- //修改购物车中商品的数量
- WC()->cart->set_quantity( $item_key, $quantity );
- //删除购物车中的商品
- WC()->cart->remove_cart_item( $item_key );
- //使用优惠券,参数就是优惠码
- WC()->cart->apply_coupon( $coupon_code );
- //删除优惠券,参数也是优惠码
- WC()->cart->remove_coupon( $coupon_code );
- //删除所有的优惠券
- WC()->cart->remove_coupons();
- //重新计算购物车价格
- WC()->cart->calculate_totals();
方法中,有一些注意点,add_to_cart、set_quantity 以及 remove_cart_item,这些对商品增减的方法执行后,购物车会自动调用 calculate_totals 计算价格。但 apply_coupon 和 remove_coupon 这些对优惠券的方法执行后,需要自己执行一遍 calculate_totals 计算价格。
此外,set_quantity 和 remove_cart_item 的参数$item_key,是当前购物车中商品对应的键值,这些键是通过 JSON 格式存储的,需要通过 WooCommerce 自己封装的方法获取:
对于普通商品,已知$product_id,可通过以下方法获得$item_key
- $product_cart_id = WC()->cart->generate_cart_id( $product_id );
- $item_key = WC()->cart->find_product_in_cart( $product_cart_id );
对可变商品,已知$variation_id,则是通过遍历方法获取
- /* Author: Brain - blog.brain1981.com */
- foreach ( WC()->cart->get_cart() as $item_key => $item ) {
- // If the targeted variation id is in cart
- if ( $item['variation_id'] == $variation_id ) {
- $item_key ...
- break;
- }
- }
通过以上总结的常用方法组合,我们大致就可以开发出自己的购物车程序了,列举一个常用的列出购物车商品清单的函数:
- /* Author: Brain - blog.brain1981.com */
- function brain1981_rest_wc_cart_list($request = null) {
- if ( is_null( WC()->cart ) ) {
- wc_load_cart();
- }
- WC()->cart->get_cart();
- $resaults = [];
- if( WC()->cart->is_empty() ){//如果没有物品则直接返回
- return $resaults;
- }
- foreach ( WC()->cart->get_cart() 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( $resaults, $api_item);
- }
- return $resaults;
- }
文章標題:WooCommerce购物车对象使用以及方法函数概括
文章連結:https://www.wuyanshuo.cn/808.html
更新時間:2022年5月25日
1、本站所有資源均不添加推廣檔案或浮水印,壓縮包內若有廣告檔案和浮水印請勿輕易相信。
2、本站資源均為兩層壓縮,第一層7z(尾碼若為wys,請自行修改為7z)有解壓密碼; 第二層zip或cbz,無解壓密碼,可直接使用漫畫類軟件程式查看; 詳情可參攷解壓教程。
3、本站大部分內容均收集於網絡! 若內容侵犯到您的權益,請發送郵件至:admin#wysacg.top我們將第一時間處理! 資源所需價格並非資源售賣價格,是收集、整理、編輯詳情以及本站運營的適當補貼,並且本站不提供任何免費技術支援。 所有資源僅限於參攷和學習,版權歸原作者所有!