我尝试学习WooCommerce的cookies,用于执行添加到购物车中的产品操作的任何功能。我在控制台document.cookie
中写道
我得到了这些数据:
woocommerce_items_in_cart=1;
woocommerce_cart_hash=500d17f6c010b62b25c3f52893be945d;
我知道Cookie“woocommerce_cart_hash
”包含购物车中的产品,但我不明白如何获取产品的名称。它是什么500d17f6c010b62b25c3f52893be945d
任何帮助都将不胜感激。
答案 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'] );