WooCommerce : get orders by user ID and order status

本文代码来自客户定制项目 WooCommerce DRM 。

获取 WooCommerce 版本前,先判断 WooCommerce 是否已被弃用,如果尚未启用,返回0,如果已启用,尝试获取transient,获取到就返回,未获取到就去获取。

在 WooCommerce 被安装时,删除可能存在的WooCommerce 版本 的transient。

获取到 WooCommerce 版本后,依据版本不同根据用户ID和要获取的订单状态尝试获取订单ID数组,返回可能为false。

  1. /*add action*/
  2. public function woocommerce_installed(){
  3.     $wc_v = get_transient(‘wc_drm_wc_v’);
  4.     if(!(false===$wc_v)){
  5.       delete_transient(‘wc_drm_wc_v’);
  6.     }
  7. }
  8. public function get_wc_version(){
  9.     /*ensure WooCommerce has be activated.*/
  10.     if(!defined(‘WOOCOMMERCE_VERSION’)) return 0;
  11.     $wc_v = get_transient(‘wc_drm_wc_v’);
  12.     if(false===$wc_v){
  13.         //$wc_v = get_option( ‘woocommerce_version’ );
  14.        /*
  15.            global $woocommerce;
  16.            $wc_v =   is_object($woocommerce)?$woocommerce->version:0;
  17.           return $wc_v 
  18.       */
  19.         $wc_v =   WOOCOMMERCE_VERSION;
  20.         set_transient( ‘wc_drm_wc_v’, $wc_v,  DAY_IN_SECONDS*7);
  21.     }
  22.     return $wc_v;
  23. }
  24. /*
  25. based on 
  26. https://woocommerce.wordpress.com/2014/08/07/wc-2-2-order-statuses-plugin-compatibility/
  27. */
  28. public function get_all_user_orders($user_id,$status=’completed’){
  29.         if(!$user_id)
  30.             return false;
  31.         /*
  32.         WooCommerce has be activated?if so, get its version.
  33.          */
  34.         $wc_v = $this->get_wc_version();
  35.         if(!$wc_v) return false;
  36.         $orders=array();
  37.        if(version_compare($wc_v, ‘2.2‘,'<‘)){
  38.         $args = array(
  39.             ‘numberposts’     => –1,
  40.             ‘meta_key’        => ‘_customer_user’,
  41.             ‘meta_value’      => $user_id,
  42.             ‘post_type’       => ‘shop_order’,
  43.             ‘post_status’     => ‘publish’,
  44.             ‘tax_query’=>array(
  45.                     array(
  46.                         ‘taxonomy’  =>’shop_order_status’,
  47.                         ‘field’     => ‘slug’,
  48.                         ‘terms’     =>$status
  49.                         )
  50.             )
  51.         );
  52.         $posts=get_posts($args);
  53.         $orders=wp_list_pluck( $posts, ‘ID’ );
  54.     }else{
  55.         global $wpdb;
  56.         $sql = “SELECT ID FROM {$wpdb->posts} as posts 
  57.                 INNER JOIN {$wpdb->postmeta} as meta
  58.                 WHERE   posts.post_type     = ‘shop_order’
  59.                 AND  posts.post_status = ‘wc-{$status}’
  60.                 AND  meta.post_id = posts.ID
  61.                 AND  meta.meta_key = ‘_customer_user’
  62.                 AND  meta.meta_value = {$user_id}
  63.         “;
  64.         $orders_query = $wpdb->get_results($sql);
  65.         if(is_wp_error($orders_query)||empty($orders_query)) return false;
  66.         foreach($orders_query as $order){
  67.             $orders[] = $order->ID;
  68.         }
  69.     }
  70.    return $orders;
  71. }

使用

  1. global $CWP_WC_DRM;
  2. //the parameter of the following function is $user_id.
  3. $a = $CWP_WC_DRM->get_all_user_orders(1);

返回示例:

  1. array(
  2.   “26”,
  3.   “29”,
  4.   “32”,
  5.   “151”
  6. )

返回的是该用户已经完成的订单的ID。要点是上述代码中注释中涉及到的链接。

 

7岁生日快乐,WooThemes!

woothemes-7th-birthday

7岁生日快乐,WooThemes!

7年前的这一周,Mark Forrester、Magnus Jepson和Adii Pienaar三个人弄了个科技公司WooThemes,提供优质的 WordPress 主题给大家,然后,这家公司走到了今天,它的产品 WooCommerce 成为了世界上使用量最大的独立电子商务平台。

Mark 说:

七年前,在我位于伦敦的卧室办公室里,我完全想不到我设计制作的WordPress主题会让陌生人成为我的生意合作伙伴,今天回到开普敦(南非第二大城市,立法首都),坐在这里,我们已经有了一个高效的国际化的Woo大家庭,和一个使用量巨大的、以超乎想象的高速成长的电子商务平台,并且,我们已经成为了Automattic( 是WordPress的母公司 )家庭中的一员了!

WooCommerce

WooThemes 的成功,WooCommerce 可以说是最大的功臣。

4年前, WooThemes 推出了 WooCommerce ,刚开始时, WooCommerece 是一个收费插件,后来, WooThemes 把它免费提供给大家使用了。如今, WooCommerce 运行在100多万个网站上,并已有了850多万次下载。

WooCommerce download stats

WooCommerce Active Installs

 

Celebrating the success of WooCommerce

据我推测:Automattic 收购 WooThemes,主要就是看上了 WooCommerce。

Sensei

Sensei 是 WooThemes 团队12名成员创作的在线教育系统,自2013年发布以来,收到了1800多个贡献,也是 WooThemes 的拳头产品。

Storefront

这是为 WooCommerce 而生的 WordPress 主题,自去年发布以来,已经被下载了27万多次,并收到500多个贡献,此项目由15人维护,这是一个免费的项目!

WooThemes 这七年,一图以蔽之

woothemes-7th-birthday-all-in-one

再次说:

7岁生日快乐,WooThemes!

祝 WooThemes 越来越好!

WooCommerce App Helper

WooCommerce App Helper 是一个WooCommerce 服务端,作用是为基于WooCommerce 的电子商务APP提供一套使用JSON进行交互的接口,本文为部分开发记录。

1. 创建订单端口create_order的正确的数据格式:

  1. Array
  2. (
  3.     [order] => Array
  4.         (
  5.             [payment_details] => Array
  6.                 (
  7.                     [method_id] => weixinpay
  8.                     [method_title] => 微信支付
  9.                     [paid] =>
  10.                 )
  11.             [billing_address] => Array
  12.                 (
  13.                     [first_name] => 李
  14.                     [last_name] => 发财
  15.                     [address_1] => 我的地址栏1
  16.                     [address_2] =>
  17.                     [city] => 郑州
  18.                     [state] => CN17
  19.                     [postcode] => 450001
  20.                     [country] => CN
  21.                     [email] => a@example.com
  22.                     [phone] => 5555555
  23.                 )
  24.             [shipping_address] => Array
  25.                 (
  26.                     [first_name] => 李
  27.                     [last_name] => 发财
  28.                     [address_1] => 我的地址栏1
  29.                     [address_2] =>
  30.                     [city] => 郑州
  31.                     [state] => CN17
  32.                     [postcode] => 450001
  33.                     [country] => CN
  34.                 )
  35.             [customer_id] => 1
  36.             [line_items] => Array
  37.                 (
  38.                     [0] => Array
  39.                         (
  40.                             [product_id] => 10
  41.                             [quantity] => 2
  42.                         )
  43.                     [1] => Array
  44.                         (
  45.                             [product_id] => 22
  46.                             [quantity] => 1
  47.                         )
  48.                 )
  49.             [shipping_lines] => Array
  50.                 (
  51.                     [0] => Array
  52.                         (
  53.                             [method_id] => flat_rate
  54.                             [method_title] => Flat Rate
  55.                             [total] => 32
  56.                         )
  57.                 )
  58.         )
  59. )

测试用例1:
商品数据:

  1. $line_items = array(
  2.     array(
  3.         “product_id” => 53,
  4.         “quantity” => 1
  5.     ),
  6.     array(
  7.         “product_id” => 43,
  8.         “quantity” => 1
  9.     ),
  10. );

完整的参数数据:

  1. $args = array(‘order’=>array(
  2.                 ‘payment_details’=>array(
  3.                     ‘method_id’=>’weixinpay’,
  4.                     ‘method_title’=>’微信支付’,
  5.                     ‘paid’=>false,
  6.                 ),
  7.                 ‘billing_address’=>array(
  8.                   “first_name” => ‘当前用户的姓氏’,
  9.                   “last_name” => ‘当前用户的名字’,
  10.                   “address_1” => ‘当前用户的地址’,
  11.                   “address_2” => “”,
  12.                   “country” => ‘CN’,
  13.                   “state” => ‘CN17’,
  14.                   “city” => ‘郑州’,
  15.                   “postcode” => ‘100010‘,
  16.                   “email” => ‘suifengtec@qq.com’,
  17.                   “phone” => ‘13800138000
  18.                 ),
  19.                 ‘shipping_address’=>array(
  20.                   “first_name” => ‘当前用户的姓氏’,
  21.                   “last_name” => ‘当前用户的名字’,
  22.                   “address_1” => ‘当前用户的地址’,
  23.                   “address_2” => “”,
  24.                   “country” => ‘CN’,
  25.                   “state” => ‘CN17’,
  26.                   “city” => ‘郑州’,
  27.                   “postcode” => ‘100010‘,
  28.                   “email” => ‘suifengtec@qq.com’,
  29.                   “phone” => ‘13800138000
  30.                 ),
  31.                 ‘customer_id’=>’1‘,
  32.                 ‘line_items’=>$line_items,
  33.                 ‘shipping_lines’=>array(array(
  34.                       “method_id” => “free_shipping”,
  35.                       “method_title”=> “免费送货”,
  36.                       “total” => 0
  37.                 ))
  38.     ));

测试用例2:

  1. $arr ='{
  2.   “order”: {
  3.     “payment_details”: {
  4.       “method_id”“weixinpay”,
  5.       “method_title”“微信支付”,
  6.       “paid”false
  7.     },
  8.     “billing_address”: {
  9.       “first_name”“李”,
  10.       “last_name”“发财”,
  11.       “address_1”“我的地址栏1”,
  12.       “address_2”“”,
  13.       “city”“郑州”,
  14.       “state”“CN17”,
  15.       “postcode”“450001”,
  16.       “country”“CN”,
  17.       “email”[email protected],
  18.       “phone”“5555555”
  19.     },
  20.     “shipping_address”: {
  21.       “first_name”“李”,
  22.       “last_name”“发财”,
  23.       “address_1”“我的地址栏1”,
  24.       “address_2”“”,
  25.       “city”“郑州”,
  26.       “state”“CN17”,
  27.       “postcode”“450001”,
  28.       “country”“CN”
  29.     },
  30.     “customer_id”1,
  31.     “line_items”: [
  32.       {
  33.         “product_id”10,
  34.         “quantity”2
  35.       },
  36.       {
  37.         “product_id”22,
  38.         “quantity”1
  39.       }
  40.     ],
  41.     “shipping_lines”: [
  42.       {
  43.         “method_id”“flat_rate”,
  44.         “method_title”“Flat Rate”,
  45.         “total”32
  46.       }
  47.     ]
  48.   }
  49. }’;
  50. $args = json_decode($arr,true);

 

返回的JSON数据解码后为:

  1. {
  2.   order: {
  3.     id: 164
  4.     order_number: 164
  5.     created_at: “2015-07-01T10:06:45Z”
  6.     updated_at: “2015-07-01T10:06:45Z”
  7.     completed_at: “2015-07-01T10:06:45Z”
  8.     status: “pending”
  9.     currency: “CNY”
  10.     total: “122.02”
  11.     subtotal: “90.02”
  12.     total_line_items_quantity: 3
  13.     total_tax: “0.00”
  14.     total_shipping: “32.00”
  15.     cart_tax: “0.00”
  16.     shipping_tax: “0.00”
  17.     total_discount: “0.00”
  18.     shipping_methods: “Flat Rate”
  19.     payment_details: {
  20.         method_id: “weixinpay”
  21.         method_title: “微信支付”
  22.         paid: false
  23.     }
  24.     billing_address: {
  25.       first_name: “李”
  26.       last_name: “发财”
  27.       company: “”
  28.       address_1: “我的地址栏1”
  29.       address_2: “”
  30.       city: “郑州”
  31.       state: “CN17”
  32.       postcode: “450001”
  33.       country: “CN”
  34.       email: [email protected]
  35.       phone: “5555555”
  36.     }
  37.     shipping_address: {
  38.       first_name: “John”
  39.       last_name: “Doe”
  40.       company: “”
  41.       address_1: “我的地址栏1”
  42.       address_2: “”
  43.       city: “郑州”
  44.       state: “CN17”
  45.       postcode: “450001”
  46.       country: “CN”
  47.     }
  48.     note: “”
  49.     customer_ip: “115.*.*.*”
  50.     customer_user_agent: “”
  51.     customer_id: 1
  52.     view_order_url: “http://域名/my-account/view-order/164”
  53.     line_items: [2]
  54.     0:  {
  55.       id: 189
  56.       subtotal: “0.02”
  57.       subtotal_tax: “0.00”
  58.       total: “0.02”
  59.       total_tax: “0.00”
  60.       price: “0.01”
  61.       quantity: 2
  62.       tax_class: null
  63.       name: “测试商品1”
  64.       product_id: 10
  65.       sku: “tpp1”
  66.       meta: [0]
  67.     }
  68.     1:  {
  69.       id: 190
  70.       subtotal: “90.00”
  71.       subtotal_tax: “0.00”
  72.       total: “90.00”
  73.       total_tax: “0.00”
  74.       price: “90.00”
  75.       quantity: 1
  76.       tax_class: null
  77.       name: “测试商品0”
  78.       product_id: 22
  79.       sku: “”
  80.       meta: [0]
  81.     }
  82.     shipping_lines: [1]
  83.     0:  {
  84.     id: 191
  85.     method_id: “flat_rate”
  86.     method_title: “Flat Rate”
  87.     total: “32.00”
  88.     }
  89.     tax_lines: [0]
  90.     fee_lines: [0]
  91.     coupon_lines: [0]
  92.     customer: {
  93.       id: 1
  94.       created_at: “2015-04-23T14:28:34Z”
  95.       email: [email protected]
  96.       first_name: “李”
  97.       last_name: “发财”
  98.       username: [email protected]
  99.       role: “administrator”
  100.       last_order_id: “164”
  101.       last_order_date: “2015-07-01T10:06:45Z”
  102.       orders_count: 13
  103.       total_spent: “540.00”
  104.       avatar_url: “#”
  105.       billing_address: {
  106.         first_name: “李”
  107.         last_name: “发财”
  108.         company: “某某公司”
  109.         address_1: “我的地址栏1”
  110.         address_2: “”
  111.         city: “郑州”
  112.         state: “CN17”
  113.         postcode: “450001”
  114.         country: “CN”
  115.         email: [email protected]
  116.         phone: “5555555”
  117.       }
  118.       shipping_address: {
  119.         first_name: “李”
  120.         last_name: “发财”
  121.         company: “某某公司”
  122.         address_1: “我的地址栏1”
  123.         address_2: “”
  124.         city: “郑州”
  125.         state: “CN17”
  126.         postcode: “450001”
  127.         country: “CN”
  128.       }
  129.       gender: “male”
  130.     }
  131.   }
  132. }

 

2. 更新订单端口 update_order 更新订单状态的参数数据格式

  1. Array
  2. (
  3.     [order] => Array
  4.         (
  5.             [status] => completed
  6.         )
  7. )

返回数据与新建订单端口一致。

可用的状态:

  1. pending
  2. processing
  3. refunded
  4. canceled
  5. prepraring
  6. waiting
  7. completed

上面的 preparing、waiting为自定义的订单状态,其它几种为用得上的 WooCommerce 内置的订单状态。

3.获取运费的端点 getshipping

应ZYC需求定制。

参数数据(可选):

  1. {“id”:”位置代码”}

如果没有参数数据,将会默认返回:

  1. {“flat_rate”:{“id”:“flat_rate”,“cost”:“30”,“fee”:“0”},“custom”:{“01001”:{“cost”:“30”,“fee”:“2”},“01002”:{“cost”:“35”,“fee”:“3”}}}

如果传递的有参数数据,将按照参数返回,示例如下:

  1. {“01001”:{“cost”:“30”,“fee”:“2”}}

返回数据中的cost为运费,fee为手工费,在WooCommerce中设置,此外需要注意:app中的配送类型的slug需要与WooCommerce一致。

4. 按照优惠券代码返回优惠券信息的端点:getcouponbycode
参数数据:

  1. {“code”:”优惠券代码”}

或者

  1. {“v”:”优惠券代码”}

返回示例:

  1. {
  2.     coupon: {
  3.         id: 18
  4.         code: “off-12”
  5.         type: “percent_product”
  6.         created_at: “2015-04-23T15:43:31Z”
  7.         updated_at: “2015-07-01T11:02:24Z”
  8.         amount: “12.00”
  9.         individual_use: false
  10.         product_ids: [0]
  11.         exclude_product_ids: [0]
  12.         usage_limit: null
  13.         usage_limit_per_user: null
  14.         limit_usage_to_x_items: 0
  15.         usage_count: 0
  16.         expiry_date: “2016-09-30T00:00:00Z”
  17.         enable_free_shipping: true
  18.         product_category_ids: [0]
  19.         exclude_product_category_ids: [0]
  20.         exclude_sale_items: false
  21.         minimum_amount: “0.00”
  22.         maximum_amount: “0.00”
  23.         customer_emails: [0]
  24.         description: “”
  25.     }
  26. }

5. 返回微信access_token的端点getwechataccesstoken
备注:由LY定制。
参数正确则返回:

  1. {
  2.     wx_access_token: {
  3.         access_token: 正确的返回值
  4.     }
  5. }

参数缺失则返回:

  1. {“errors”:[{“code”:“601”,“message”:“Please check the Wechat APP ID and the APP key !”}]}

6. 返回关于我们页面的端点 about
该页面可以在后台设置,设置之后,会在about端点上返回,无需参数,返回数据为标准的WordPress post数据,返回格式为json,详见在线测试的实例。

7. 返回APP 首页上方幻灯项目组的端点 homesliders
无需参数,按照设定的幻灯返回,返回格式示例(以转换为可视化的JSON):

  1. {
  2. sliders: [3]
  3.     0:  {
  4.         media: “http://在线测试的域名/wp-content/uploads/2015/04/122.jpg”
  5.         txt: “幻灯文本1”
  6.         url: “http://coolwp.com”
  7.     }
  8.     1:  {
  9.         media: “http://在线测试的域名/wp-content/uploads/2015/04/122.jpg”
  10.         txt: “幻灯文本2”
  11.         url: “http://www.suoling.net”
  12.     }
  13.     2:  {
  14.         media: “http://在线测试的域名/wp-content/uploads/2015/04/23.jpg”
  15.         txt: “幻灯文本3”
  16.         url: “http://www.coolwp.com”
  17.     }
  18. }

8.获取特定产品分类的端点 category
参数数据

  1. {“id”:”产品分类的ID”}

返回示例:

  1. {
  2. product_category: {
  3.     id: 9
  4.     name: “蒙古国海军特产”
  5.     slug: “mg”
  6.     parent: 0
  7.     description: “”
  8.     count: 2
  9.     img: “http://在线测试的域名/wp-content/uploads/2015/04/7.jpg”
  10.     pid: [2]
  11.         0:  “22”
  12.         1:  “43”
  13.     childids: [2]
  14.         0:  11
  15.         1:  12
  16.     }
  17. }

上述返回中的pid标示该产品分类下的产品ID的数组,数组长度为该分类下产品的数量,childids表示该分类的子分类的ID。

9. 申请重置用户密码的端点 resetpwd

参数数据

  1. {
    “to”: “手机号”,
    “msg”: “阿拉伯数字”,
    “test”: false
    }

其中,msg为可选参数,如果没有,将有服务器生成5位随机的阿拉伯数字,test表示是否为测试模式,如果为真,就不实际通过移动通信网关发布,直接返回短信发送成功的结果。

短信发送成功后返回的结果:

  1. {“ok”:[{“id”:用户的ID,“to”:手机号码,“message”:验证码内容,“timestamp”:时间戳}]}

短信发送成功的前提是:

1). 这个手机已经与网站用户/顾客相关联;

2). 发送手机短信的网关畅通,发送短信的网关与移动运营商之间的网关畅通,移动运营商并未将发送短信的号码列为垃圾号码,你的手机上的安全程序并未将发送短信的号码列为垃圾号码,所以,请选定一家靠谱的运营商,经过实际测试,Twilio并不理想(最大延迟可达半个小时左右),Clickatell并不理想(最大延时可达半个小时,并且与中国国内的移动运营商之间的关系似乎并不好,先是使用106开头的号码发送,后来发现使用133开头的手机号发送,并且还有漏发现象,漏发依然扣钱)。

短信发送失败则返回:

  1. {“errors”:[{“code”:“600”,“message”:“Sending failure!”}]}

10.更新用户资料的端点 updateuser
参数数据分两类:
1).更新用户的

  1. pwd(密码)
  2. nickname(昵称)
  3. email(电邮)
  4. phone(手机号)
  5. gender(性别)

请使用:

  1. {
    “id”: “用户ID”,
    “type”: “类型”,
    “value”: “值”
    }

2). 更新用户的其它资料,请使用(应ZYC于2015.07.01提出的需求增加):

  1. {
  2.     “id”“用户ID”,
  3.     “type”“others”,
  4.     “value”: {
  5.         “key”“字段名”,
  6.         “v”“新值”
  7.     }
  8. }

执行成功后返回:

  1. {“done”:[{“done”:true,“type”:“被修改的字段”,“value”:“新值”}]}

用户不存在则返回:

  1. {“errors”:[{“code”:“600”,“message”:“Account Not Exist!!!”}]}

缺失必要参数则返回:

  1. {“errors”:[{“code”:“602”,“message”:“Something is wrong !”}]}

或者

  1. {“errors”:[{“code”:“601”,“message”:“Nothing to do !”}]}

 

注意:以最新版说明为有效版本,链接:http://coolwp.com/woocommerce-app-helper.html