WooCommerce的session数据主要保存在两个地方:数据库和浏览器的Cookie,保存session的数据表叫wp_woocommerce_sessions,cookie名称为wp_woocommerce_session_[hash_id]。源代码在class-wc-session-handler.php中。
目录
WooCommerce Session Cookie
首先把浏览器里的session cookie拿出来解读一下。
名称:wp_woocommerce_session_bbfa5b726c6b7a9cf3cda9370be3ee91
值:1||1637651243||1637647643||d6773a955145c2ab8184c89a353af812
cookie的值由四部分组成,用||分隔,翻译成变量是下面这样:
$customer_id||$session_expiration||$session_expiring||$cookie_hash
这四部分的含义如下:
- 用户ID,登录用户的话就是user ID,游客则是一个hash字符串。
- cookie过期时间,默认48小时。
- cookie过期时间减去一个小时,也就是47小时,可以理解为cookie续期时间。
- cookie鉴别码,主要是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要,也就是散列消息鉴别码。密钥就是WordPress wp-config.php里定义的密钥,消息则是由用户ID+session过期时间组成的字符串。
这个cookie是一把钥匙,通过这把钥匙可以到数据库里领取有关用户的详细信息,比如:
- 购物车内容
- 购物车总价
- 优惠相关信息
- 用户地址信息
- 移除的购物车内容
- 选择的快递方式
- 快递费
- 选择的付款方式
- 自定义session数据
移除的产品会被session记录,所以可以恢复移出购物车的产品。自定义session允许我们记住一些数据,方便后面调用。
可以看出,WooCommerce的session并不是php session,不需要session_start(),它是以数据库为存储媒介的。
如何使用WooCommerce Session
add_action( 'template_redirect', 'sola_use_woocommerce_session' );
function sola_use_woocommerce_session(){
// 获取session实例
$session = WC()->session;
// 添加key为my_custom_session的session
$session->set( 'my_custom_session', '自定义数据' );
// 获取session数据
$session->get( 'my_custom_session' );
// 测试session是否存在
$session->has_session( 'my_custom_session' );
// 从数据库彻底删除session
$session->__unset( 'my_custom_session' );
// 将session值设为null模拟删除,实际还是存在在数据库里
$session->set( 'my_custom_session', null );
}
WooCommerce Session加载过程
- 有人访问网站时,WooCommerce会初始化session,从数据库取出数据,以类属性的方式存储到session类里。
- 如果网页执行过程中session发生改变,WooCommerce会通过一个flag记住session发生了变化这件事。
- 在WordPress
shutdown
action执行时,如果session有变化,WooCommerce会将更新后的数据写回数据库。
为何删除session表里的数据不能清空用户购物车
用户购物车的数据除了存储在session里,还会存储在wp_usermeta表里,在文章WooCommerce查看所有用户购物车中有提到过,这个表的数据会同步到session里面。用户的地址这类信息同样存在usermeta里,也会同步。另外,数据还会存储在WordPress Object Cache中,还有缓存这一层,仅仅清除session是无法完全清空用户信息的。
要清空所有用户的购物车数据,可以使用WooCommerce自带的清除客户会话的工具,如下图所示。
要永久删除用户数据,可以打开WooCommerce的用户清理功能,如下图所示。