php - 如何使用 WooCommerce 检索 cart_item_data?

标签 php wordpress woocommerce cart

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

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

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

最后,使用 get_item_data()方法我以为我已经全部弄清楚了。我传入了购物车项目对象,以及……一个空字符串。如果我传递 key 而不是购物车项目本身,则相同。

我应该如何访问购物车商品数据?


这是“添加购物车项目数据”功能,它有效(或至少看起来有效):

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

最佳答案

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

问题在于,当购物车商品从 session 中恢复时,数据会被清理。因此,额外的购物车商品数据会存储到 session 中,但在下一次请求时不会恢复。

有一个过滤器“woocommerce_get_cart_item_from_session”。作为第一个参数,您将获得经过清理的购物车项目(没有额外数据),作为第二个参数,您将获得存储到 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 );

您无需在后台显示数据,所有订单项目元数据都会自动显示。

关于php - 如何使用 WooCommerce 检索 cart_item_data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25188365/

相关文章:

连接具有相同字段名称的表时的 PHP 关联数组

php - 以特定的 html 结构显示一些简单和可变产品的数据

ios - 如何将 iOS 应用程序连接到 Wordpress?

WordPress:如何防止顶级菜单项成为链接?

php - 我可以更改 Yoast 在 WordPress 站点中生成的描述元标记的内容吗?

wordpress - Woocommerce:我只想在 fancybox 中显示带有描述的产品图库图像

wordpress - Woocommerce 获取数组中的产品标签

php - 可以将文件从客户端的机器上传到托管表单的网络服务器外部的服务器吗?

php - 关于外键的 SQL 语法错误

javascript - 将值从 PHP 传递到 JavaScript