【问题标题】:WooCommerce cookies and sessions - Get the current products in cartWooCommerce cookie 和会话 - 获取购物车中的当前产品
【发布时间】:2016-11-27 12:46:53
【问题描述】:

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

woocommerce_items_in_cart=1;
woocommerce_cart_hash=500d17f6c010b62b25c3f52893be945d;

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

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript wordpress session cookies woocommerce


    【解决方案1】:

    只是跟进此事,以防有人感兴趣。选定的答案对于分解事情非常有帮助。 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'] );
    

    【讨论】:

      【解决方案2】:

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

      数据不存储在 cookie 中,而是存储在 DB WooCommerce 会话中的相应引用中(详情请参阅下文)...

      您还必须注意,WordPress 启用了一些本地数据存储。

      下面的数据取自一个真实的例子,其中一个未登录的用户将 2 个产品添加到购物车。

      1) 当非登录用户向购物车添加东西时,Woocommerce 设置了 3 个 cookie:

      • woocommerce_cart_hash => 44ffcb32800e5b20cfbb080753d48408 (安全/完整性哈希)
      • woocommerce_items_in_cart => 1 (当购物车中有东西时设置为 1
      • wp_woocommerce_session_3413758cad2ada414127ffee7347e40f => ac5f880c99503169574ad996f35f85c5%7C%7C1469492696%7C%7C1469489096%7C%7C17e565032403642121f5ad12cfa72c41 (与wp_woocommerce_sessions DB table created the session at the same time than this cookie完全相关)

      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 value,你会发现你可以用%7C%7C 子字符串来剪切它,所以我们在这里得到了这个cookie值的4个子字符串:

      • ac5f880c99503169574ad996f35f85c5(与表 wp_woocommerce_sessions 的 DB session_keysession_value 中的引用相同)。
      • 1469492696(表 wp_woocommerce_sessions 的 DB session_expiry)。
      • 1469489096 (同上)
      • 17e565032403642121f5ad12cfa72c41 (??? - 我真的不知道这是干什么用的……)

      如果用户回来删除购物车中的一项:

      • woocommerce_cart_hashcookie值变化
      • woocommerce_items_in_cartcookie 值不会随着商品留在购物车中而改变。
      • wp_woocommerce_session_3413758cad2ada414127ffee7347e40fcookie 值不会改变。
      • DB wp_woocommerce_sessionsTABLE会话 ID 6 已被 生成的删除/替换 strong>会话 ID 反映了购物车的变化(只有一种产品)

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

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

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

      最后,Class WC_Ajax 用于更改购物车。


      参考资料:

      【讨论】:

      • 感谢您的详细解答!
      • cookie "wp_woocommerce_session_.." 的最后一部分是 cookie 哈希。
      猜你喜欢
      • 2017-04-27
      • 2014-02-06
      • 2022-09-27
      • 2015-07-21
      • 2014-05-13
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 2017-04-28
      相关资源
      最近更新 更多