WooCommerce

如何使用WooCommerce Session

WooCommerce的session数据主要保存在两个地方:数据库和浏览器的Cookie,保存session的数据表叫wp_woocommerce_sessions,cookie名称为wp_woocommerce_session_[hash_id]。源代码在class-wc-session-handler.php中。

WooCommerce Cookies

WooCommerce Session Cookie

首先把浏览器里的session cookie拿出来解读一下。

名称:wp_woocommerce_session_bbfa5b726c6b7a9cf3cda9370be3ee91
值:1||1637651243||1637647643||d6773a955145c2ab8184c89a353af812

cookie的值由四部分组成,用||分隔,翻译成变量是下面这样:

$customer_id||$session_expiration||$session_expiring||$cookie_hash

这四部分的含义如下:

  1. 用户ID,登录用户的话就是user ID,游客则是一个hash字符串。
  2. cookie过期时间,默认48小时。
  3. cookie过期时间减去一个小时,也就是47小时,可以理解为cookie续期时间。
  4. 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加载过程

  1. 有人访问网站时,WooCommerce会初始化session,从数据库取出数据,以类属性的方式存储到session类里。
  2. 如果网页执行过程中session发生改变,WooCommerce会通过一个flag记住session发生了变化这件事。
  3. 在WordPress shutdown action执行时,如果session有变化,WooCommerce会将更新后的数据写回数据库。

为何删除session表里的数据不能清空用户购物车

用户购物车的数据除了存储在session里,还会存储在wp_usermeta表里,在文章WooCommerce查看所有用户购物车中有提到过,这个表的数据会同步到session里面。用户的地址这类信息同样存在usermeta里,也会同步。另外,数据还会存储在WordPress Object Cache中,还有缓存这一层,仅仅清除session是无法完全清空用户信息的。

要清空所有用户的购物车数据,可以使用WooCommerce自带的清除客户会话的工具,如下图所示。

要永久删除用户数据,可以打开WooCommerce的用户清理功能,如下图所示。