如何根据指定session_key获取WooCommerce结账购物车商品
根据指定session_key获取WooCommerce购物车商品方案
方案一:直接解析数据库序列化数据
WooCommerce的session_value字段存储的是序列化数组,可直接查询数据库并反序列化提取购物车内容:
- 通过目标
session_key查询对应记录 - 反序列化
session_value,提取cart字段后再次反序列化(因为cart字段本身也是序列化字符串)
示例代码:
global $wpdb; $target_session_key = 't_2ca6a9a0ec3a668971f8bdbebea4c3'; // 查询数据库获取session_value $session_data = $wpdb->get_var( $wpdb->prepare( "SELECT session_value FROM {$wpdb->prefix}woocommerce_sessions WHERE session_key = %s", $target_session_key ) ); if ($session_data) { // 反序列化主session数据 $unserialized_data = unserialize($session_data); if (isset($unserialized_data['cart'])) { // 反序列化购物车数据 $cart_contents = unserialize($unserialized_data['cart']); // 遍历输出购物车商品信息 foreach ($cart_contents as $item) { echo '商品ID:' . $item['product_id'] . '<br>'; echo '商品数量:' . $item['quantity'] . '<br>'; // 可按需提取更多字段,比如variation_id、line_subtotal等 } } else { echo '该会话无购物车数据'; } } else { echo '未找到对应session_key的记录'; }
方案二:利用WooCommerce内置方法(结合你提到的钩子)
如果想复用WooCommerce的购物车处理逻辑,可以临时切换会话并触发购物车加载:
- 保存当前会话的session_key(避免影响当前用户会话)
- 将目标session_key设置到WC会话中
- 调用
get_cart_from_session方法加载对应购物车 - 获取内容后恢复原会话
示例代码:
function get_cart_by_session_key($target_session_key) { // 保存当前会话key $original_session_key = WC()->session->get_session_cookie()['session_key'] ?? ''; // 设置目标会话key WC()->session->set_session_key($target_session_key); // 触发购物车加载(复用内置方法) WC()->cart->get_cart_from_session(); // 获取购物车内容 $cart_contents = WC()->cart->get_cart(); // 恢复原会话key,避免影响当前用户 if ($original_session_key) { WC()->session->set_session_key($original_session_key); WC()->cart->get_cart_from_session(); } return $cart_contents; } // 使用示例 $target_session_key = 't_2ca6a9a0ec3a668971f8bdbebea4c3'; $cart = get_cart_by_session_key($target_session_key); if (!empty($cart)) { foreach ($cart as $item_key => $item) { echo '商品名称:' . $item['data']->get_name() . '<br>'; echo '商品数量:' . $item['quantity'] . '<br>'; echo '商品总价:' . wc_price($item['line_total']) . '<br>'; } } else { echo '购物车为空或会话无效'; }
注意事项
- 先检查
session_expiry字段,确保会话未过期(对比当前Unix时间戳即可) - 反序列化时可能出现格式错误,建议添加错误捕获逻辑
- 方案二需要在WooCommerce初始化完成后调用(比如在
template_redirect钩子之后执行)
内容的提问来源于stack exchange,提问作者Sylwester Zabielski
相关产品推荐
相关产品推荐

