tag plugin manager get_the_archive_title php wordpress woocommerce cart

php - plugin - ¿Cómo recuperar cart_item_data con WooCommerce?



meta tags wordpress plugin (2)

Durante la función add_to_cart , hay un filtro para agregar "datos del artículo del carrito". El filtro es woocommerce_add_cart_item_data . Esperaba almacenar los datos de mi complemento personalizado en este, de modo que los datos se almacenen en relación con el elemento y se puedan agregar múltiples productos con datos diferentes.

Todo esto pareció funcionar, pero no puedo recuperar los datos. No puedo resolverlo. Los datos están ahí , puedo verlos en una cadena serializada, pero no puedo sacarlos.

echo ''<pre>''; var_dump( WC() ); foreach( WC()->cart->get_cart() as $cart_item ) { var_dump( $cart_item ); var_dump( WC()->cart->get_item_data( $cart_item ) ); } echo ''</pre>'';

El primer volcado de WC() tiene una propiedad: session->_data->cart->(serialized data) . Sin embargo, la propiedad _data está protegida, pero puedo ver mi campo personalizado dentro de los datos serializados.

$ Cart_item es una matriz con product_id y algunos otros datos, pero no incluye mis datos personalizados :(

Finalmente, usando el método get_item_data() , pensé que lo tenía todo resuelto. Pasé en el objeto objeto de carrito, y ... una cadena vacía. Lo mismo si paso la clave, en lugar del elemento del carrito.

¿Cómo se supone que debo acceder a los datos del artículo del carrito?

Aquí está la función "Agregar datos del artículo del carrito", que funciona (o al menos parece funcionar):

function save_class_menu_selection( $cart_item_data, $product_id, $variation_id ) { if ( !product_is_class( $product_id ) ) return $cart_item_data; // Save the date, or give a fatal warning. Date is required. if ( !empty($_REQUEST[''class-date'']) ) { $cart_item_data[''class-date''] = stripslashes($_REQUEST[''class-date'']); return $cart_item_data; }else{ wp_die(''<h2>Invalid Class Date Selected</h2><p>You tried to add a class to your cart, but the date selected was invalid. Please try again.</p>''); exit; } } add_filter( ''woocommerce_add_cart_item_data'', ''save_class_menu_selection'', 10, 3 );


Desafortunadamente, no pude hacer funcionar los datos predeterminados del artículo del carrito. Siento que puede no implementarse correctamente, o incluso puede estar en desuso, ya que hay una falta de apoyo y documentación.

En su lugar, utilicé una variable de sesión de carro para lograr lo mismo. Es simplemente una matriz donde cada clave es cart_item_key . El valor de cada matriz es otra matriz, que contiene un par de campos clave y valor de campos personalizados. Por lo tanto, es esencialmente lo mismo que los datos del elemento del carrito incorporado, excepto que se almacenan como datos de sesión del carrito.

Aquí hay un Gist que contiene algunas funciones de utilidad para hacerlo más fácil:

https://gist.github.com/RadGH/e3444fc661554a0f8c6f

O si desea construirlo usted mismo, la magia está en la WC()->session . Aquí están las dos funciones clave para que esto funcione:

WC()->session->get(''_my_cart_item_data''); WC()->session->set(''_my_cart_item_data'', $cart_item_data_array);

Estos son los ganchos de acción que necesitarás:

<<<EXAMPLES action: woocommerce_add_to_cart desc: When an item is added to the cart. args: $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data action: woocommerce_add_order_item_meta desc: When a cart item is converted to an order item, save metadata to the order item using the function "wc_add_order_item_meta( $item_id, $key, $value )" args: item_id, $values, $cart_item_key


Hoy estuve en la misma situación y me tropecé con esta pregunta después de algunas investigaciones. Después de un poco de ingeniería inversa, encontré el problema y quiero proporcionar una solución para otra que también pueda tropezar con esta pregunta.

El problema es que los datos se sanean cuando los elementos del carrito se restauran de la sesión. Por lo tanto, los datos del artículo del carrito adicional se almacenan en la sesión, pero en la siguiente solicitud no se restauran.

Hay un filtro "woocommerce_get_cart_item_from_session". Como primer parámetro, obtiene el artículo de carrito desinfectado (sin datos adicionales) y como segundo todos los datos que se almacenaron en la sesión (incluidos los datos adicionales).

La solución es conectar allí y también restaurar los datos de los artículos de su carrito personalizado.

Código de ejemplo:

add_filter( ''woocommerce_add_cart_item_data'', function ( $cartItemData, $productId, $variationId ) { $cartItemData[''myCustomData''] = ''someCustomValue''; return $cartItemData; }, 10, 3 ); add_filter( ''woocommerce_get_cart_item_from_session'', function ( $cartItemData, $cartItemSessionData, $cartItemKey ) { if ( isset( $cartItemSessionData[''myCustomData''] ) ) { $cartItemData[''myCustomData''] = $cartItemSessionData[''myCustomData'']; } return $cartItemData; }, 10, 3 );

Para mostrar también los datos en la página de compra / compra, puede utilizar el siguiente código:

add_filter( ''woocommerce_get_item_data'', function ( $data, $cartItem ) { if ( isset( $cartItem[''myCustomData''] ) ) { $data[] = array( ''name'' => ''My custom data'', ''value'' => $cartItem[''myCustomData''] ); } return $data; }, 10, 2 );

Lo último ahora es guardar los datos cuando se realiza el pedido:

add_action( ''woocommerce_add_order_item_meta'', function ( $itemId, $values, $key ) { if ( isset( $values[''myCustomData''] ) ) { wc_add_order_item_meta( $itemId, ''myCustomData'', $values[''myCustomData''] ); } }, 10, 3 );

No tiene que hacer nada más para mostrar los datos dentro del backend, todos los metadatos de elementos de pedido se muestran automáticamente.