Woocommerce:如何将元数据添加到购物车项目?
Woocommerce: how do I add metadata to a cart item?
我有一个用数量和价格描述的数字产品,但还需要 3 个数字才能完全指定它(Unix 日期等)。问题:如何将这些号码放入购物车?
据我所知,有两种可能的处理方法:
- 产品变体
- 产品自定义字段
看起来变体只能处理范围有限的 离散 值(即 red/yellow/green、S/M/L 等),而不能处理一般整数,如日期。这留下了自定义字段。我认为我说自定义字段是产品 post 页面上的普通元数据是正确的,因此我可以使用 get_post_meta
和 update_post_meta
.
来处理它们
所以,如果我选择自定义字段,那么我会在订购期间更新产品页面字段,然后我会在结账期间读回该字段,当 WC_Order
创建时,并添加该字段到新订单。但是,这是行不通的。我无法更改产品页面上的元数据,因为该产品对所有客户都是全球性的,并且此操作会干扰其他客户。 换句话说,您不能在产品中存储特定于订单的信息,因此这些选项都不起作用。
那么,如何存储临时产品元数据并在订购和结账阶段之间传递它(即在 WC_Cart
和 WC_Order
之间)?
一种选择是将其存储为 用户 元数据(或会话数据?),但必须有更好的方法 - 有什么想法吗?
事实证明,使用会话数据很容易做到这一点。当您将商品添加到购物车时(请参阅 add_to_cart_action
的来源),您会创建一个会话变量,其中包含所有额外的元数据:
WC()->session->set(
'my_session_var_name',
array(
'members' => $members,
'start' => $start,
'expiry' => $expiry,
'etc' => $etc));
当用户结帐时,购物车数据消失,并创建了一个新订单。您可以连接到 woocommerce_add_order_item_meta
以将会话元数据添加到订单元数据:
add_action(
'woocommerce_add_order_item_meta', 'hook_new_order_item_meta', 10, 3);
function hook_new_order_item_meta($item_id, $values, $cart_item_key) {
$session_var = 'my_session_var_name';
$session_data = WC()->session->get($session_var);
if(!empty($session_data))
wc_add_order_item_meta($item_id, $session_var, $session_data);
else
error_log("no session data", 0);
}
就是这样。不过,您确实必须弄清楚如何获取订单元数据并使用它做一些有用的事情。您可能还想清除会话数据,从挂钩到 woocommerce_before_cart_item_quantity_zero
和 woocommerce_cart_emptied
。要点 here 有一些示例代码。
我有一个用数量和价格描述的数字产品,但还需要 3 个数字才能完全指定它(Unix 日期等)。问题:如何将这些号码放入购物车?
据我所知,有两种可能的处理方法:
- 产品变体
- 产品自定义字段
看起来变体只能处理范围有限的 离散 值(即 red/yellow/green、S/M/L 等),而不能处理一般整数,如日期。这留下了自定义字段。我认为我说自定义字段是产品 post 页面上的普通元数据是正确的,因此我可以使用 get_post_meta
和 update_post_meta
.
所以,如果我选择自定义字段,那么我会在订购期间更新产品页面字段,然后我会在结账期间读回该字段,当 WC_Order
创建时,并添加该字段到新订单。但是,这是行不通的。我无法更改产品页面上的元数据,因为该产品对所有客户都是全球性的,并且此操作会干扰其他客户。 换句话说,您不能在产品中存储特定于订单的信息,因此这些选项都不起作用。
那么,如何存储临时产品元数据并在订购和结账阶段之间传递它(即在 WC_Cart
和 WC_Order
之间)?
一种选择是将其存储为 用户 元数据(或会话数据?),但必须有更好的方法 - 有什么想法吗?
事实证明,使用会话数据很容易做到这一点。当您将商品添加到购物车时(请参阅 add_to_cart_action
的来源),您会创建一个会话变量,其中包含所有额外的元数据:
WC()->session->set(
'my_session_var_name',
array(
'members' => $members,
'start' => $start,
'expiry' => $expiry,
'etc' => $etc));
当用户结帐时,购物车数据消失,并创建了一个新订单。您可以连接到 woocommerce_add_order_item_meta
以将会话元数据添加到订单元数据:
add_action(
'woocommerce_add_order_item_meta', 'hook_new_order_item_meta', 10, 3);
function hook_new_order_item_meta($item_id, $values, $cart_item_key) {
$session_var = 'my_session_var_name';
$session_data = WC()->session->get($session_var);
if(!empty($session_data))
wc_add_order_item_meta($item_id, $session_var, $session_data);
else
error_log("no session data", 0);
}
就是这样。不过,您确实必须弄清楚如何获取订单元数据并使用它做一些有用的事情。您可能还想清除会话数据,从挂钩到 woocommerce_before_cart_item_quantity_zero
和 woocommerce_cart_emptied
。要点 here 有一些示例代码。