Update (related to complicated @KMcAloon added answer)
Get the session cookie and the cart from session, in a simple way (indexed arrays):
$session_cookie = WC()->session->get_session_cookie();
$cart_from_session = WC()->session->get('cart');
Original answer:
As you will see below, woocommerce_cart_hash
doesn't contains the products in cart, because there is a third more complex cookie related to WooCommerce sessions DB table.
The data is not stored in the cookie herself but in a corresponding reference located in DB WooCommerce session (see below for details)...
Update: For registered users, "persistent" cart data is also stored as user metadata (see this thread).
You have also to note that WordPress enable some local data storage.
The data below is taken from a real example case, where a non logged user add 2 products to cart.
- Woocommerce set 3 cookies when a non logged user add something to cart:
woocommerce_cart_hash
=> 44ffcb32800e5b20cfbb080753d48408
(security/integrity hash)
woocommerce_items_in_cart
=> 1
(set to 1
when something is in cart)
wp_woocommerce_session_3413758cad2ada414127ffee7347e40f
=> ac5f880c99503169574ad996f35f85c5%7C%7C1469492696%7C%7C1469489096%7C%7C17e565032403642121f5ad12cfa72c41
(completely related to wp_woocommerce_sessions
DB table created session at the same time than this cookie)
- And in DB table
wp_woocommerce_sessions
a session is generated at the same time:
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
I can't explain all core processes (for that you will need to look in php core files).
But if you look to wp_woocommerce_session_…
cookie value you will see that you can cut it with %7C%7C
substring, so we get here 4 substrings for this cookie value:
ac5f880c99503169574ad996f35f85c5
(same reference that in the DB session_key
and session_value
of table wp_woocommerce_sessions
).
1469492696
(the DB session_expiry
of table wp_woocommerce_sessions
).
1469489096
(same thing above).
17e565032403642121f5ad12cfa72c41
(??? - I don't really know what is this for…)
If the user come back and delete one item in his cart:
woocommerce_cart_hash
cookie value changes
woocommerce_items_in_cart
cookie value don't changes as an item remains in cart.
wp_woocommerce_session_3413758cad2ada414127ffee7347e40f
cookie value don't changes.
- DB
wp_woocommerce_sessions
TABLE, the session ID 6
has been deleted/replaced by a new generated session ID is that reflects the cart changes (only one product).
So at this point you can see the relation between cookies and session DB table wp_woocommerce_sessions
that contains all cart data related to non logged users
(in a **session_value
serialized multidimensional array or object).
With Class WC_Cart you will be able to get this data.
You should also be able to use WC()->cart
syntax in your php code…
With Class WC_Session_Handler you will be able to manipulate sessions herself.
And to finish, Class WC_Ajax is used for cart changes.
References: