如何使用WooCommerce检索cart_item_data?

2022-08-30 18:54:01

add_to_cart功能期间,有一个过滤器用于添加“购物车项目数据”。筛选器为 。我希望将我的自定义插件数据存储在其中,以便相对于项目存储数据,并且可以使用不同的数据添加多个产品。woocommerce_add_cart_item_data

这一切似乎都有效,但我无法检索数据。我无法弄清楚。数据就在那里,我可以在序列化的字符串中看到它,但我无法将其拉出。

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

的第一个转储具有属性:。不过,_data属性受到保护,但我可以在序列化数据中看到我的自定义字段。WC()session->_data->cart->(serialized data)

$cart_item 是一个包含其他数据的数组,但它不包括我的自定义数据:(product_id

最后,使用get_item_data()方法,我认为我已经弄清楚了。我传入了购物车项目对象,并且...空字符串。同样,如果我传递钥匙,而不是购物车项目本身。

我应该如何访问购物车项目数据?


以下是“添加购物车项目数据”功能,该功能有效(或至少似乎有效):

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

答案 1

我今天也处于同样的情况,经过一些研究后偶然发现了这个问题。经过一些逆向工程,我发现了问题,并希望为其他问题提供解决方案,这可能也会绊倒这个问题。

问题是,当从会话中恢复购物车项目时,数据将被清理。因此,额外的购物车项目数据存储到会话中,但在下一个请求时,它不会恢复。

有一个过滤器“woocommerce_get_cart_item_from_session”。作为第一个参数,您将获得经过消毒的购物车项目(没有额外数据),其次是存储到会话中的所有数据(包括额外数据)。

解决方案是挂在那里,并恢复您的自定义购物车项目数据。

示例代码:

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

要在购物车/结账页面上显示数据,您可以使用以下代码:

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

现在的最后一件事是在下订单时保存数据:

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

您无需执行任何其他操作即可在后端显示数据,所有订单项元数据都会自动显示。


答案 2

不幸的是,我无法让默认的购物车项目数据正常工作。我觉得它可能没有正确实现,甚至可能被弃用,因为缺乏支持和文档。

相反,我使用购物车会话变量来完成同样的事情。它只是一个数组,其中每个键都是 .每个数组的值是另一个数组,其中包含自定义字段的键值对。因此,它本质上与内置购物车项目数据相同,只是存储为购物车会话数据。cart_item_key

下面是一个包含一些实用程序函数的要点,以使其变得简单:

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


或者,如果您想自己构建它,那么神奇之处就在于 。以下是实现这一点的两个关键功能:WC()->session

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

这些是您将需要的操作钩子:

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

推荐