WooCommerce cookies和会话 - 获取当前产品的购物车

时间:2016-07-23 20:57:57

标签: javascript wordpress session cookies woocommerce

我尝试学习WooCommerce的cookies,用于执行添加到购物车中的产品操作的任何功能。我在控制台document.cookie中写道 我得到了这些数据:

woocommerce_items_in_cart=1;
woocommerce_cart_hash=500d17f6c010b62b25c3f52893be945d;

我知道Cookie“woocommerce_cart_hash”包含购物车中的产品,但我不明白如何获取产品的名称。它是什么500d17f6c010b62b25c3f52893be945d

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:15)

正如您将在下面看到的, woocommerce_cart_hash不包含购物车中的产品,因为有一个第三个更复杂的coockie WooCommerce会话数据库表

数据不会存储在Cookie中,而是存储在DB WooCommerce会话中的相应参考中(详见下文) ...

您还需要注意,WordPress会启用一些本地数据存储。

  

以下数据来自一个真实的案例,非登录用户将2个产品添加到购物车。

1)当非登录用户向购物车添加内容时,Woocommerce设置3个coockies:

  
      
  • woocommerce_cart_hash => 44ffcb32800e5b20cfbb080753d48408 (安全/完整性哈希)
  •   
  • woocommerce_items_in_cart => 1 (当购物车中有商品时设置为1
  •   
  • wp_woocommerce_session_3413758cad2ada414127ffee7347e40f => ac5f880c99503169574ad996f35f85c5%7C%7C1469492696%7C%7C1469489096%7C%7C17e565032403642121f5ad12cfa72c41 (与此Cookie完全相关的 wp_woocommerce_sessions 数据库表创建会话)
  •   

2)在数据库表 wp_woocommerce_sessions 中,会话同时生成:

  

session_id => 6
   session_key => ac5f880c99503169574ad996f35f85c5
   session_value => a:18:{s:4:"cart";s:600:"a:2:{s:32:"d82c8d1619ad8176d665453cfb2e55f0";a:9:{s:10:"product_id";i:53;s:12:"variation_id";i:0;s:9:"variation";a:0:{}s:8:"quantity";i:1;s:10:"line_total";d:35;s:8:"line_tax";i:0;s:13:"line_subtotal";i:35;s:17:"line_subtotal_tax";i:0;s:13:"line_tax_data";a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}}}s:32:"a5bfc9e07964f8dddeb95fc584cd965d";a:9:{s:10:"product_id";i:37;s:12:"variation_id";i:0;s:9:"variation";a:0:{}s:8:"quantity";i:1;s:10:"line_total";d:18;s:8:"line_tax";i:0;s:13:"line_subtotal";i:18;s:17:"line_subtotal_tax";i:0;s:13:"line_tax_data";a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}}}}";s:15:"applied_coupons";s:6:"a:0:{}";s:23:"coupon_discount_amounts";s:6:"a:0:{}";s:27:"coupon_discount_tax_amounts";s:6:"a:0:{}";s:21:"removed_cart_contents";s:6:"a:0:{}";s:19:"cart_contents_total";d:53;s:5:"total";d:53;s:8:"subtotal";i:53;s:15:"subtotal_ex_tax";i:53;s:9:"tax_total";i:0;s:5:"taxes";s:6:"a:0:{}";s:14:"shipping_taxes";s:6:"a:0:{}";s:13:"discount_cart";i:0;s:17:"discount_cart_tax";i:0;s:14:"shipping_total";N;s:18:"shipping_tax_total";i:0;s:9:"fee_total";i:0;s:4:"fees";s:6:"a:0:{}";}
  session_expiry => 1469492696

我无法解释所有核心进程(因为你需要查看php核心文件)。
但是,如果您查看wp_woocommerce_session_… Cookie值,您会看到可以使用%7C%7C子字符串剪切它,因此我们在此处获得此Cookie值的4个子字符串:

  
      
  • ac5f880c99503169574ad996f35f85c5(表格中 session_key session_value 的相同参考 wp_woocommerce_sessions )。
  •   表格 1469492696
  • session_expiry(数据库 wp_woocommerce_sessions
  •   
  • 1469489096 (上面同样的事情)
  •   
  • 17e565032403642121f5ad12cfa72c41(??? - 我真的不知道这是为了什么......)
  •   

如果用户回来并删除购物车中的一件商品:

  • woocommerce_cart_hash Cookie 值更改
  • woocommerce_items_in_cart Cookie 值不会随着商品保留在购物车中而发生变化。
  • wp_woocommerce_session_3413758cad2ada414127ffee7347e40f Cookie 值不会更改。
  • 数据库wp_woocommerce_sessions会话ID 6 删除/替换 生成的会话ID 反映购物车更改(仅限一种产品)
  

因此,此时您可以看到Cookie和会话数据库表wp_woocommerce_sessions之间的关系,其中包含与非登录用户相关的所有购物车数据
  (在 session_value 序列化 多维数组或对象中)

     

使用Class WC_Cart,您将能够获得此数据。
您还应该能够在PHP代码中使用WC()->cart语法...

     

使用Class WC_Session_Handler,您将能够自己操纵会话。

     

要完成,Class WC_Ajax用于购物车更改。

参考文献:

答案 1 :(得分:2)

只要有人对此感兴趣,只需跟进。选择的答案对于分解问题非常有帮助。 OP正在询问如何从会话Cookie中获取产品,所以我想我会跟进。

这就是我从wc_woocommerce_session_ cookie中提取购物车数据的方式:

  $session_id = null;
  $values = null;

  foreach( $_COOKIE as $key => $value ) {

    if( stripos( $key, 'wp_woocommerce_session_' ) === false ) {
      continue;
    }

    $values = explode( '||', $value );

  }

  $session_id = $values[0];
  $session = new WC_Session_Handler();
  $session_data = $session->get_session( $session_id );

  // Contains array of items in cart including product ids, quantities, totals, etc.
  $cart_data = unserialize( $session_data['cart'] );