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

ABE*_*ABE 6 javascript cookies wordpress session woocommerce

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

woocommerce_items_in_cart=1;
woocommerce_cart_hash=500d17f6c010b62b25c3f52893be945d;
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,将不胜感激.

Loi*_*tec 19

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

数据不会存储在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 (与wp_woocommerce_sessions此cookie同时与DB表创建的会话完全相关)

2)在DB表中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(与DB session_keysession_value表中的相同参考wp_woocommerce_sessions).
  • 1469492696(session_expiry表格的DB wp_woocommerce_sessions).
  • 1469489096 (以上相同的东西).
  • 17e565032403642121f5ad12cfa72c41 (??? - 我真的不知道这是为了什么...)

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

  • woocommerce_cart_hashcookie值的变化
  • woocommerce_items_in_cart当商品保留在购物车中时,Cookie值不会更改.
  • wp_woocommerce_session_3413758cad2ada414127ffee7347e40fcookie值不会改变.
  • DB wp_woocommerce_sessionsTABLE,会话ID6已被删除/替换生成的会话ID,这反映了购物车的更改(只有一个产品).

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

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

使用Class WC_Session_Handler,您将能够自己操作会话.

最后,Class WC_Ajax用于购物车更换.


参考文献:


KMc*_*oon 7

只是为了跟进此事,以防有人感兴趣。所选答案对于分解问题非常有帮助。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'] );
Run Code Online (Sandbox Code Playgroud)