Форма на стр. корзина — как отправить ее данные в заказ Woocommerce?
Хочу добавить форму на страницу корзины только если есть определенный товар.
Как отправить данные с нее в заказ?
Данные в заказ можно добавить через woocommerce_thankyou - но между корзиной и thankyou есть страница checkout.
Как это делается?
я нашла только
WC()->session->set
Возможно есть более разумный способ?
Дополнительно
Вы хотите добавить дополнительные поля на базовую страницу корзины, если в корзину добавлен определенный товар? Какой товар?
Я не понимаю стойкое нежелание делать как положено, при чекауте, но хозяин-барин..
Хочу добавить на базовую страницу корзины не дополнительные поля, а отдельную форму в всплывающем окне по условию наличия в корзине товара-пробника
По ходу дела, эта форма еще должна всплывать, чем дольше разговор, тем больше подробностей...
Хотя... Можно добавить вариативный товар "причина заказа товара-пробника", если есть стойкое желание именно из корзины "выбирать причину" :)
Да я понимаю, что кастомная форма на странице корзины - это очень не стандартное решение.
(Я так полагаю вы сильно не вникали в методы хранения товаров (при добавлении в корзину). На странице корзина есть форма woocommerce-cart-form. ) Форма не добавляет данные в заказ сразу с корзины , это делает чекаут/thankyou. Насколько я поняла есть промежуточное место хранения данных WC()->cart->get_cart().
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Данные формы на странице корзины нужно сохранить до checkout, например в WooCommerce session, а затем при создании заказа перенести их в order meta. Hook
woocommerce_thankyouслишком поздний: заказ уже создан.Схема:
WC()->session.Сохранение из POST:
add_action('template_redirect', function () { if (! is_cart() || empty($_POST['my_cart_field'])) { return; } WC()->session->set('my_cart_field', sanitize_text_field(wp_unslash($_POST['my_cart_field']))); });
Запись в заказ:
add_action('woocommerce_checkout_create_order', function ($order) { $value = WC()->session->get('my_cart_field'); if ($value) { $order->update_meta_data('_my_cart_field', $value); } });
После создания заказа можно очистить session:
add_action('woocommerce_thankyou', function () { WC()->session->__unset('my_cart_field'); });
Если поле обязательно, валидируйте его до оформления заказа через
woocommerce_checkout_process. Session здесь нормальный способ, потому что между корзиной и заказом действительно есть checkout.