Comment récupérer des données d'item cart avec WooCommerce?

pendant le add_to_cart fonction, il y a un filtre pour ajouter panier de l'élément de données". Le filtre est woocommerce_add_cart_item_data. Je m'attendais à stocker mes données de plugin personnalisé dans ce, de sorte que les données sont stockées par rapport à l'article et plusieurs produits peuvent être ajoutés avec des données différentes.

tout Cela semblait fonctionner, mais je ne suis pas en mesure de récupérer les données. Je ne peux pas le comprendre. Les données sont là, je peux le voir dans une chaîne sérialisée, mais je ne peux pas le tirer hors.

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>';

Le premier dump de WC() possède une propriété: session->_data->cart->(serialized data). La propriété _data est protégée, cependant, mais je peux voir mon champ personnalisé à l'intérieur des données sérialisées.

$cart_item est un tableau avec product_id et quelques autres données, mais il ne comprend pas mes données personnalisées :(

enfin, en utilisant le get_item_data() méthode je pensais avoir tout compris. Je suis passé dans l'objet cart item, et... une chaîne vide. Même si je passe de la clé, plutôt que l'article de panier lui-même.

Comment suis-je supposé accéder aux données de l'article cart?


Voici la fonction "Add cart item data", qui fonctionne (ou du moins semble fonctionner):

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 );
19
demandé sur Radley Sustaire 2014-08-07 21:10:53

2 réponses

Le problème est que les données sont désinfectés lorsque le chariot éléments restauré à partir de la session. Ainsi, les données de l'élément supplémentaire du panier sont stockées dans la session, mais sur la requête suivante, elles ne sont pas restaurées.

Il y a un filtre "woocommerce_get_cart_item_from_session". Comme premier paramètre vous obtenez l'article de panier aseptisé (sans données supplémentaires) et comme deuxième toutes les données qui ont été stockées dans la session (y compris les données supplémentaires).

LA solution est d'y accrocher et aussi de restaurer vos données personnalisées.

Exemple De Code:

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 );

aussi De montrer les données au panier/page de paiement, vous pouvez utiliser le code suivant:

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 );

la dernière chose maintenant est de sauvegarder les données lors de la commande:

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 );

vous n'avez pas à faire quoi que ce soit d'autre le show les données à l'intérieur du backend, toutes les méta-données de l'ordre sont affichées automatiquement.

39
répondu Stefan 2015-09-09 12:07:51

Je n'ai pas pu faire fonctionner les données par défaut de l'item cart, malheureusement. Je pense qu'il n'est peut-être pas correctement mis en œuvre, ou qu'il est même déprécié, car il y a un manque de soutien et de documentation.

au lieu de cela, j'ai utilisé une variable de session de panier pour accomplir la même chose. C'est simplement un tableau où chaque touche est le cart_item_key. La valeur de chaque tableau est encore un autre tableau, contenant une paire clé-valeur des champs personnalisés. Donc, c'est essentiellement la même chose que les données d'article de panier intégré, sauf stocké sous forme de données de session de panier à la place.

voici un Gist contenant quelques fonctions utilitaires pour le rendre facile:

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


Ou si vous souhaitez créer vous-même, la magie est dans WC()->session. Voici les deux fonctions clés pour que cela fonctionne:

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

il s'agit de l'action des crochets, vous aurez besoin de:

<<<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
5
répondu Radley Sustaire 2015-08-07 19:01:10