Woocommerce: как добавить метаданные в элемент корзины?

У меня есть цифровой продукт, который описывается количеством и ценой, но для этого требуется еще 3 номера (даты Unix и т.д.). Проблема: как получить эти цифры в корзину?

Насколько я вижу, есть два возможных способа справиться с этим:

  • Изменение продукта
  • Пользовательское поле продукта

Похоже, что вариации могут обрабатывать только дискретные значения с ограниченным диапазоном (т.е. красный/желтый/зеленый, S/M/L и т.д.) и не могут обрабатывать общие целые числа, например даты. Это оставляет настраиваемые поля. Я думаю, что я прав, говоря, что пользовательские поля являются обычными метаданными на странице публикации продукта, поэтому я могу обрабатывать их с помощью get_post_meta и update_post_meta.

Итак, если я перейду к пользовательским полям, тогда я бы обновил поле страницы продукта во время заказа, а затем я прочитал бы поле во время проверки, когда будет создан WC_Order, и добавьте поле в новый порядок, Однако это не сработает. Я не могу изменять метаданные на странице продукта, потому что продукт является глобальным для всех клиентов, и эта операция будет мешать другим клиентам. Другими словами, вы не можете хранить информацию о заказе в продукте, поэтому ни один из этих параметров не будет работать.

Итак, как хранить временные метаданные продукта и передавать его между фазами упорядочения и проверки (т.е. между WC_Cart и WC_Order)?

Один из вариантов - сохранить его как пользовательские метаданные (или данные сеанса?), но должен быть лучший способ - любые идеи?

Ответ 1

Оказалось, что это легко сделать с данными сеанса. Когда вы добавляете элемент в корзину (см. Источник для 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. Там gist здесь, в котором есть пример кода для этого.