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 здесь, в котором есть пример кода для этого.