Woocommerce:如何将元数据添加到购物车项目?

EML*_*EML 12 woocommerce

我有一个数字产品,由数量和价格描述,但也需要3个数字来完全指定它(Unix日期等).问题:如何将这些数字放入购物车?

据我所知,有两种方法可以解决这个问题:

  1. 产品变化
  2. 产品自定义字段

看起来变体只能处理范围有限的离散值(即红色/黄色/绿色,S/M/L等),并且不能处理一般整数,如日期.留下自定义字段.我认为我说自定义字段是产品帖子页面上的普通元数据,所以我可以用get_post_meta和处理它们update_post_meta.

因此,如果我选择自定义字段,那么我会在订购时更新产品页面字段,然后我会在结帐时,WC_Order创建时读回字段,并将字段添加到新订单.但是,这不起作用.我无法更改产品页面上的元数据,因为该产品对所有客户都是全局的,并且此操作会干扰其他客户.换句话说,您无法在产品中存储特定于订单的信息,因此这些选项都不起作用.

那么,如何存储临时产品元数据并在订购和结账阶段之间传递(即在WC_Cart和之间WC_Order)?

一种选择是将其存储为用户元数据(或会话数据?),但必须有更好的方法 - 任何想法?

EML*_*EML 17

事实证明,使用会话数据很容易做到这一点.当您将项目添加到购物车时(请参阅源代码add_to_cart_action),您可以创建一个会话变量,其中包含所有其他元数据:

  WC()->session->set(
     'my_session_var_name',
     array(
        'members' => $members,
        'start'   => $start,
        'expiry'  => $expiry,
        'etc'     => $etc));
Run Code Online (Sandbox Code Playgroud)

当用户结账时,购物车数据消失,并创建新订单.您可以挂钩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);
}
Run Code Online (Sandbox Code Playgroud)

而已.但是,您必须弄清楚如何获取订单元数据并使用它做一些有用的事情.您可能还想清除会话数据,从挂钩到woocommerce_before_cart_item_quantity_zero,和woocommerce_cart_emptied.这里有一个要点,它有一些示例代码.

  • `woocommerce_add_order_item_meta`被删除:https://docs.woothemes.com/wc-apidocs/function-woocommerce_add_order_item_meta.html也许可以使用`wc_add_order_item_meta`:https://docs.woothemes.com/wc-apidocs/function-wc_add_order_item_meta html的 (3认同)