Как добавить дополнительные услуги в корзину WooCommerce?

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

К каждому продукту индивидуально прилагаются дополнительные услуги, каким образом можно сделать так, чтобы при нажатии на чекбокс услуги она добавлялась в корзину вместе с товаром?

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

Ответы:

Самый простой вариант на мой взгляд, это услугу добавить как товар, и услуготовар добавить как вариацию к товару:) При клике на вариацию, пользователь ознакомится с услугой и при желании кинет и ее в корзину.
Также в корзине можно выводить доп товары. Типа cross-sele вроде

Нужно решить такую задачу?

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

Заказать помощь
Лучший ответ
1
Backend-редакция Ответ

Самый надёжный вариант — сделать дополнительные услуги отдельными товарами WooCommerce и добавлять их в корзину вместе с основным товаром. Так услуга будет видна в заказе, у неё будет своя цена, налоги, статус и аналитика. Если услуги индивидуальны для каждого товара, можно связать их через ACF-поле или upsell/cross-sell.

Если услуга должна быть просто доплатой внутри основного товара, можно добавить checkbox на странице товара и сохранить выбор в cart item data:

add_action('woocommerce_before_add_to_cart_button', function () {
    echo '<p><label><input type="checkbox" name="extra_service" value="1"> Добавить услугу настройки (+500 руб.)</label></p>';
});
 
add_filter('woocommerce_add_cart_item_data', function ($cart_item_data, $product_id) {
    if (!empty($_POST['extra_service'])) {
        $cart_item_data['extra_service'] = 1;
        $cart_item_data['unique_key'] = md5(microtime(true));
    }
 
    return $cart_item_data;
}, 10, 2);
 
add_filter('woocommerce_get_item_data', function ($item_data, $cart_item) {
    if (!empty($cart_item['extra_service'])) {
        $item_data[] = [
            'name'  => 'Дополнительная услуга',
            'value' => 'Настройка',
        ];
    }
 
    return $item_data;
}, 10, 2);
 
add_action('woocommerce_before_calculate_totals', function ($cart) {
    if (is_admin() && !defined('DOING_AJAX')) {
        return;
    }
 
    foreach ($cart->get_cart() as $cart_item) {
        if (!empty($cart_item['extra_service'])) {
            $product = $cart_item['data'];
            $product->set_price((float) $product->get_price() + 500);
        }
    }
});

add_action('woocommerce_before_add_to_cart_button', function () { echo '<p><label><input type="checkbox" name="extra_service" value="1"> Добавить услугу настройки (+500 руб.)</label></p>'; }); add_filter('woocommerce_add_cart_item_data', function ($cart_item_data, $product_id) { if (!empty($_POST['extra_service'])) { $cart_item_data['extra_service'] = 1; $cart_item_data['unique_key'] = md5(microtime(true)); } return $cart_item_data; }, 10, 2); add_filter('woocommerce_get_item_data', function ($item_data, $cart_item) { if (!empty($cart_item['extra_service'])) { $item_data[] = [ 'name' => 'Дополнительная услуга', 'value' => 'Настройка', ]; } return $item_data; }, 10, 2); add_action('woocommerce_before_calculate_totals', function ($cart) { if (is_admin() && !defined('DOING_AJAX')) { return; } foreach ($cart->get_cart() as $cart_item) { if (!empty($cart_item['extra_service'])) { $product = $cart_item['data']; $product->set_price((float) $product->get_price() + 500); } } });

Для нескольких услуг лучше не хардкодить цену в коде, а хранить список услуг в настройках товара и валидировать выбранные ID. Если нужна полноценная коммерческая логика, быстрее и безопаснее взять готовый плагин типа Product Add-Ons, Composite Products или связку с дополнительными товарами.

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

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

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

комментарий

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

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