Saltar al contenido

Sesiones y cookies de WooCommerce: obtenga los productos actuales en el carrito

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 a 1 cuando hay algo en el carro)
  • wp_woocommerce_session_3413758cad2ada414127ffee7347e40f => ac5f880c99503169574ad996f35f85c5%7C%7C1469492696%7C%7C1469489096%7C%7C17e565032403642121f5ad12cfa72c41 (completamente relacionado con wp_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 DB session_key y session_value de mesa wp_woocommerce_sessions).
  • 1469492696 (el DB session_expiry de mesa wp_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ón 6 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 un session_value serializado matriz u objeto multidimensional).

Con Clase WC_Cart podrá obtener estos datos.
También debería poder usar WC()->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'] );
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *