Solución:
Como verá a continuación, woocommerce_cart_hash
no contiene los productos en el carrito, porque hay un tercera cookie más compleja relacionado con Tabla de bases de datos de sesiones de WooCommerce.
Los datos no se almacena en la propia cookie pero en una referencia correspondiente ubicada en la sesión de DB WooCommerce (ver más abajo para más detalles)…
También debe tener en cuenta que WordPress habilita cierto almacenamiento de datos local.
Los datos a continuación se toman de un caso de ejemplo real, donde un usuario no registrado agrega 2 productos al carrito.
1) Woocommerce establece 3 cookies cuando un usuario no registrado agrega algo al carrito:
woocommerce_cart_hash
=>44ffcb32800e5b20cfbb080753d48408
(hash de seguridad / integridad)woocommerce_items_in_cart
=>1
(ajustado a1
cuando hay algo en el carro)wp_woocommerce_session_3413758cad2ada414127ffee7347e40f
=>ac5f880c99503169574ad996f35f85c5%7C%7C1469492696%7C%7C1469489096%7C%7C17e565032403642121f5ad12cfa72c41
(completamente relacionado conwp_woocommerce_sessions
La tabla de base de datos creó la sesión al mismo tiempo que esta cookie)
2) Y en la tabla DB wp_woocommerce_sessions
se genera una sesión al mismo tiempo:
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
No puedo explicar todos los procesos centrales (para eso deberá buscar en los archivos centrales de php).
Pero si miras a wp_woocommerce_session_…
valor de la cookie verás que puedes cortarlo con %7C%7C
subcadena, por lo que aquí obtenemos 4 subcadenas para este valor de cookie:
ac5f880c99503169574ad996f35f85c5
(misma referencia que en el DBsession_key
ysession_value
de mesawp_woocommerce_sessions
).1469492696
(el DBsession_expiry
de mesawp_woocommerce_sessions
).1469489096
(lo mismo de arriba).17e565032403642121f5ad12cfa72c41
(??? – Realmente no sé para qué es esto …)
Si el usuario regresa y elimina un artículo de su carrito:
-
woocommerce_cart_hash
Galleta cambios de valor -
woocommerce_items_in_cart
Galleta el valor no cambia ya que un artículo permanece en el carrito. -
wp_woocommerce_session_3413758cad2ada414127ffee7347e40f
Galleta el valor no cambia. -
DB
wp_woocommerce_sessions
MESA, los ID de sesión6
ha sido eliminado / reemplazado por un nuevo generado ID de sesión es que refleja los cambios del carrito (solo un producto).
Entonces, en este punto, puede ver la relación entre las cookies y la tabla de base de datos de sesión
wp_woocommerce_sessions
que contiene todos los datos del carrito relacionados con los usuarios no registrados
(en unsession_value
serializado matriz u objeto multidimensional).Con Clase WC_Cart podrá obtener estos datos.
También debería poder usarWC()->cart
sintaxis en su código php …Con Clase WC_Session_Handler podrá manipular las sesiones ella misma.
Y para terminar Clase WC_Ajax se utiliza para cambios de carro.
Referencias:
- Clase WC_Cart
- Clase WC_Session_Handler
- Clase WC_Ajax
Solo para dar seguimiento a esto en caso de que alguien esté interesado. La respuesta seleccionada es extremadamente útil para desglosar las cosas. El OP estaba preguntando cómo obtener los productos de las cookies de sesión, así que pensé en hacer un seguimiento.
Así es como pude extraer los datos del carrito de la wc_woocommerce_session_
Galleta:
$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'] );