Форма на стр. корзина — как отправить ее данные в заказ Woocommerce?

Ссылка скопирована
1 ответ

Хочу добавить форму на страницу корзины только если есть определенный товар.
Как отправить данные с нее в заказ?
Данные в заказ можно добавить через woocommerce_thankyou - но между корзиной и thankyou есть страница checkout.
Как это делается?
я нашла только
WC()->session->set
Возможно есть более разумный способ?

Дополнительно

Вы хотите добавить дополнительные поля на базовую страницу корзины, если в корзину добавлен определенный товар? Какой товар?

  • Михаил Р., я просто проверяю товары в корзине WC()->cart->get_cart() - если есть товар, добавляю форму на страницу. Вопрос как отправить данные этой формы в заказ?
  • Что значит "форму на страницу корзины" ? Для чего? Какую задачу нужно решить? (не "форму вставить" - это путь решения неизвестной задачи, а что?)
  • Refguser, форма "выбрать причину заказа товара-пробника из списка". Определенный товар - это товар-пробник.
  • Natasha000, Вы не ответили на оба вопроса.
  • Михаил Р., Хочу добавить на базовую страницу корзины не дополнительные поля, а отдельную форму в всплывающем окне по условию наличия в корзине товара-пробника. Как отправить данные этой формы в заказ?
  • Natasha000, это не "добавить форму", а "добавить поле в форму". И это обычно делается ещё в чекауте (а то и вообще перед тем как товар положить в корзину. Т.е. доп поля товара.).
  • Refguser, нет, к товарам ни чего не нужно добавлять. Форма нужна чтобы выбрать один раз причину общую для всех товаров сразу, но вопрос не в этом. Как отправить данные с формы (если форма находится на странице корзины) в заказ? Конечно если перенести ее на страницу чекаут то все просто.
  • Natasha000, отправка заказа - это уже форма. И соответственно в неё и надо добавлять поля, а не ещё одну форму.
    Я не понимаю стойкое нежелание делать как положено, при чекауте, но хозяин-барин..
  • Refguser,

    Хочу добавить на базовую страницу корзины не дополнительные поля, а отдельную форму в всплывающем окне по условию наличия в корзине товара-пробника

    По ходу дела, эта форма еще должна всплывать, чем дольше разговор, тем больше подробностей...

  • Refguser, Все же может подскажите , как отправить данные с формы (если форма находится на странице корзины) в заказ?
  • Михаил Р., да там есть нюансы, но на данном этапе подскажите , как отправить данные с формы (если форма находится на странице корзины) в заказ? Как вообще делается передача данных с корзины в заказ , возможно есть способ добавить туда свои данные.
  • Natasha000, в корзине ничего такого не делается. Просто потому что это.. КОРЗИНА, как ни странно. Ровно такая же как тележка в супермаркете. В ней только товары, о которых продавец не узнает пока их не оформить на кассе (чекаут, внезапно).

    Хотя... Можно добавить вариативный товар "причина заказа товара-пробника", если есть стойкое желание именно из корзины "выбирать причину" :)

  • Refguser, вариативный товар "причина заказа товара-пробника", - креатив, но к сожалению не подходит.
    Да я понимаю, что кастомная форма на странице корзины - это очень не стандартное решение.
    (Я так полагаю вы сильно не вникали в методы хранения товаров (при добавлении в корзину). На странице корзина есть форма woocommerce-cart-form. ) Форма не добавляет данные в заказ сразу с корзины , это делает чекаут/thankyou. Насколько я поняла есть промежуточное место хранения данных WC()->cart->get_cart().
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Игорь Волков Ответ

    Данные формы на странице корзины нужно сохранить до checkout, например в WooCommerce session, а затем при создании заказа перенести их в order meta. Hook woocommerce_thankyou слишком поздний: заказ уже создан.

    Схема:

    1. Вывести поля на странице корзины.
    2. При отправке/обновлении корзины сохранить данные в WC()->session.
    3. На checkout показать/проверить данные при необходимости.
    4. При создании заказа записать session data в meta заказа.

    Сохранение из 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('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);
        }
    });

    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');
    });

    add_action('woocommerce_thankyou', function () { WC()->session->__unset('my_cart_field'); });

    Если поле обязательно, валидируйте его до оформления заказа через woocommerce_checkout_process. Session здесь нормальный способ, потому что между корзиной и заказом действительно есть checkout.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно