Как сделать формирование цены сборного товара в woocomerce?

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

Добрый день.
По-любому кто-то сталкивался с данным вопросом , и я надеюсь был бы рад поделиться ответом на этот вопрос :)
Есть товар в виде цветочного букета в который входят условно розы,тюльпаны, гвоздики.
Как можно реализовать чтобы при изменении цены на один из цветков цена на букет тоже менялась.
Можно конечно посчитать всё по отдельности и сформировать цену букета , но хотелось бы упростить что бы было например так : Условно 1с в которой есть база цветов с ценой за единицу и есть карточка товара букета в котором 11 роз, 4 гвоздики и 6 тюльпанов. Меняя цену в условно 1с на каждый из цветков , формируется новая цена букета на сайте в карточке букета упомянутого выше.
Буду благодарен за ваши ответы так как не совсем понимаю как это реализовать можно.
Всем хорошего дня :)

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

Ответы:

Делаете интеграцию с . Синхронизируете работу с базой данных. На выходе получаете возможность автоматического перерасчёта цены за букет, при изменение цены в БД.

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

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

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

Сборный товар в WooCommerce можно сделать разными способами, и выбор зависит от логики. Если пользователь выбирает комплектующие, а цена складывается из них, лучше смотреть в сторону Composite Products, Product Bundles или своих полей с пересчётом цены на сервере. Только JavaScript-пересчёт на фронте использовать нельзя: цену можно подменить.

Минимальная схема для своих полей: на странице товара показываете опции, сохраняете выбор в cart item data, затем меняете цену в корзине через woocommerce_before_calculate_totals.

add_filter('woocommerce_add_cart_item_data', function ($cart_item_data, $product_id) {
    if (isset($_POST['extra_price'])) {
        $cart_item_data['extra_price'] = (float) $_POST['extra_price'];
    }
 
    return $cart_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_price'])) {
            $base_price = (float) $cart_item['data']->get_regular_price();
            $cart_item['data']->set_price($base_price + (float) $cart_item['extra_price']);
        }
    }
});

add_filter('woocommerce_add_cart_item_data', function ($cart_item_data, $product_id) { if (isset($_POST['extra_price'])) { $cart_item_data['extra_price'] = (float) $_POST['extra_price']; } return $cart_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_price'])) { $base_price = (float) $cart_item['data']->get_regular_price(); $cart_item['data']->set_price($base_price + (float) $cart_item['extra_price']); } } });

Но это только скелет. В реальном магазине нужно валидировать выбранные опции, не принимать цену напрямую из формы, а считать её по ID опций на сервере. Иначе пользователь сможет отправить extra_price=0 или отрицательное значение.

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

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

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

комментарий

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

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