标签 WooCommerce 下的所有文章

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

做基于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_order_item_product函数过期问题,寻求替代函数的解决方案

woocommerce_order_item_product这个函数,在很多插件里都用到过,但是这个函数自从WooCommerce 3.0版本就开始过期了,如果你用的插件或者主题里还包含了这个函数,会产生一个这样的报错:“woocommerce_add_order_item_meta is deprecated since version 3.0.0! Use woocommerce_new_order_item instead”

尽管报错信息里提示用woocommerce_new_order_item函数代替,但实际上woocommerce_new_order_item函数的参数和woocommerce_order_item_product并不完全相同,不能靠直接替换函数名称来解决问题。

之所以写这一篇博客,是因为我之前的一篇关于产品自定义字段的博客里有代码遇到了这个报错。这里重新贴一下这段代码:

//6.在订单中保存自定义字段
add_action( 'woocommerce_add_order_item_meta', 'brain1981_product_add_on_order_item_meta', 10, 2 );
function brain1981_product_add_on_order_item_meta( $item_id, $values ) {
	if ( !empty( $values['my_custom_addon'] ) ) {
		wc_add_order_item_meta( $item_id, 'my_custom_addon', $values['my_custom_addon'], true );
	}
}
//from: https://blog.brain1981.com

查看详细 »

WooCommerce微信小程序开发,为Rest API补充图片信息

WooCommerce微信小程序开发使用WooCommerce的原生Rest API,接口中是缺少一些必要的图片信息的,这里列举两个地方:

1. 产品接口中,所有的产品图片都只有原图URL,没有带上thumbnail和其他WordPress生成的尺寸

通常商店管理员并没有太多图片的优化意识,会直接把多达几M的产品图上传。WooCommerce的主题多半会生成一些必要的小尺寸图片分别给产品列表以及购物车等地方加载,但Rest API中并不会有这些信息。微信小程序的产品列表页也是需要这些小图的,于是我们需要在接口中把这些小尺寸产品图也加入进去: 查看详细 »

WordPress项目 – WooCommerce微信小程序定制开发


最近上线的一个项目:WooCommerce定制微信小程序。基于之前的WordPress的网站(也是由我开发)后端,利用WordPress和WooCommerce的扩展能力,定制了小程序使用的API;小程序的前端则是从无到有的独立开发。能对WooCcommerce做到这样的定制扩展的建站商非常少,我们的技术优势在此项目中得到了充分体现。
查看详细 »

WooCommerce购物车对象使用以及方法函数概括

WooCommerce二次开发中,经常会需要对购物车进行改造,甚至有时候会需要重写购物车页面,所以就有必要把WooCommerce的购物车提供的接口方法做一下整理。本文对我在最近的一些项目中使用过的方法进行简要的记录。

首先,在调用任何购物车方法之前,先要检查当前页面环境对购物车对象是否可用:

1
2
3
4
if ( is_null( WC()->cart ) ) {
wc_load_cart();
}
WC()->cart->get_cart();

常用的条件函数,返回true/false

1
2
3
4
5
6
7
8
9
10
//检查购物车是否有商品
WC()->cart->is_empty();
//检查购物车是否需要付费,如果费用为0则返回false
WC()->cart->needs_payment();
//检查购物车中是否已经记录收货地址
WC()->cart->show_shipping();
//检查是不是需要寄送(用于计算运费的情况)
WC()->cart->needs_shipping();
//检查是不是有折扣,如果后台减了价格,这里会返回true
WC()->cart->has_discount();

查看详细 »

WooCommerce Rest API开发微信小程序和APP等第三方应用的鉴权方式

最近忙于自己开发基于WooCommerce的微信小程序。在决定自己研发之前,我也调查过国内已有的他人研发的WooCommerce微信小程序,对各家的产品Demo分别进行了试用后,还是决定自己从0开发一套小程序。从无到有的过程必然是一项浩大的工程,但经历一下这个过程还是很有必要的。首先,我们开发的项目100%自己掌握代码修改是最基本的要求。目前市面上已有两款第三方开源WooCommerce微信小程序,但都只是部分开源,且给出的源代码甚至不能直接跑通,使用这些开源代码做二次开发会很“受制于人”。考虑到自己也需要长期深耕定制小程序,需要随心所欲地扩展功能和设计,作为开发者就必须对项目的每一行代码都有本质理解。要达到对一个系统有本质理解的程度,最快的方法并不是去读别人的代码,而是自己写一套出来。恰好手头的一个项目给了我2个月时间,以我对WooCommerce的了解,是有信心独立完成小程序的开发的。目前项目开发已完成,点击这里可以查看案例,今后会不定期分享一些零碎的经验心得。

基于WooCommerce的Rest API开发第三方应用,首先要解决用户鉴权问题,这里要分两种情况:
1. 用户未登录
2. 用户已登录
查看详细 »

给WooCommerce的运费(Shipping Method)增加自定义描述字段

如果一个WooCommerce网站存在多种不同的运费(Shipping Method),则可能有必要让用户在运费选择的模块中了解不同运费的区别。你可以解释运输的时长,或者解释价格的构成等,总之就是提供更多信息帮助用户做出最好的选择。比如在这里,我就对每个运费添加了时长的解释:

一个便捷的办法是通过以下代码实现的:

add_filter('woocommerce_cart_shipping_method_full_label', 'brain1981_custom_shipping_method_label', 10, 2);
function brain1981_custom_shipping_method_label( $label, $method ){
	$txt = "";
	if( $method->id=="flat_rate:1" || $method->id=="free_shipping:4" ){
		$txt = 'In 15 Business days';
	}else if( $method->id=="flat_rate:2" || $method->id=="free_shipping:3" ){
		$txt = '7-10 Business days';
	}
	return $label . '<br /><small>' . $txt . '</small>';
}

需注意的是,WooCommerce的运费ID的格式都是以这样的形式呈现的:
flat_rate:1
free_shipping:2

以上这段代码就是事先辨认出这些运费ID,通过woocommerce_cart_shipping_method_full_label这个钩子在运费的标题后面增加一小段描述。如果你的运费数量不多且比较固定,这段代码就足够用了。

那么如果一个网站有很多种运费,并且经常会修改运费种类,上面这种hard codding的写法就会变得很臃肿且不易维护了。我们就需要给每个运费添加一个自定义的描述字段,实现后台管理描述,方便运维人员自己去修改运费设置。 查看详细 »

WordPress+WooCommerce保险网站案例,我能把WooCommerce定制到什么程度

最近几年有很多人找我们咨询WordPress+WooCommerce建立外贸电商网站,其中大部分人在找到我之前,并不了解我和市面上大部分其他在用WordPress的建站团队或公司在服务和技术上有什么分别。于是我打算写几篇案例分享,来展示我们对于WordPress以及WooCommerce能做到怎样大部分其他人做不到的程度。

今天的话题是一个保险网站的案例,这是一个面向留学美国高校人群的保险售卖网站,学生(或家属)需要购买医疗保险,于是Ta登录该网站。

首先,用户选择Ta所在的学校和自己的出生年月。网站已经内置了全美绝大部分的学校资料,输入简单的关键词或者学校简称,即可搜索到对应的学校:
查看详细 »

WooCommerce无插件增加优惠券功能,限定/禁止给指定用户角色(role)使用

WooCommerce提供了基本的优惠券Coupon功能,优惠券可以限定/禁止使用的产品、产品分类、限定最小和最大金额等,这些功能很实用,但仍然比较单薄,尤其是对指定用户的限制很弱,只能限定给指定邮箱的用户使用。邮箱可以使用通配符比如*@google.com,这可能比较符合国外网站的运营习惯,但对我们来说不太直观好用。我们通常希望实现的是给指定用户等级设定优惠券的使用或者禁用。本文记录如何开发出这个功能。

先看下结果:
WooCommerce无插件增加优惠券功能,限定/禁止给指定用户角色(role)使用

图中倒数第三行是WooCommerce自带的邮箱设定,最后两行就是我添加的功能,指定优惠券对某些用户等级(role)的使用和禁用。 查看详细 »

作为一名用WordPress建站的开发者,我为什么坚持尽可能少用插件?

用WordPress第十个年头了,做为一个老玩家,并且已经把WordPress作为重要谋生手段的我,今天想聊聊我对WordPress自己的理念。这些理念并不是出于一时的兴起或者道听途说形成的,而是基于我自己使用WordPress这十年的个人感受和经验,基于我自己对WordPress的学习历程,从无到有,再经过一些转折而形成的。我并不想做一个倚老卖老的说服者,企图说服大家接受我本文标题的观念,我只是想阐述,为什么在使用WordPress若干年头后,我会形成这样的想法。

一年前,我曾写过这样一篇文章 我用WordPress建站,为什么不用Elementor、The 7、Avada、Divi之类的主题和插件,本文是那篇文章想法的扩展,如果你不同意那篇文章,大概率也不会同意本文。

起初,我是怎么喜欢上WordPress的?
和所有人一样,基于WordPress开箱即用的可用性和方便的扩展性。对这两个特性的最初理解,就是我觉得网站缺少什么功能,大都能很快找到插件,安装上,再设置一下,就能马上启用,这真的太方便了。举个例子,这个网站,最初就是打算用来做我的技术博客的,写技术文章当然要贴代码段啦!WP主题没有适合代码格式的写法,怎么办?后台搜一下“code syntax”,就有一大堆插件可以选,大部分都很好用,选一个安装用户最多的装上就行了。再比如,我嫌默认主题的文章的分页不太好看,搜一下“page navi”,又有一大堆插件可以选,逐个打开他们的主页,选一个看上去最顺眼的安装上,就好了。于是,在最初,我理解的开箱即用,和扩展性,都是WordPress数以万计的插件带来的。以至于在最初的一两年里,想要实现一个什么功能,我都会直接找插件装上,随着使用过的插件越来越多,也逐渐觉得自己就是个WordPress的“专家”了。 查看详细 »