Заменить конкретную корзину в зависимости от количества товара в Woocommerce - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь изменить содержимое корзины в зависимости от количества товара в корзине.У меня в магазине только 5 товаров:

  • Product_1 => 1 панель,
  • Product_2 => 12 панелей,
  • Product_3 => 18 панелей,
  • Product_4 => 30 панелей,
  • Product_5 => 60 панелей,

Они настроены как разные продукты, поэтому нет комплектов, комплектов или чего-либо еще.Более одного панельного продукта, очевидно, дешевле, чем добавление нескольких отдельных панелей по отдельности.

Тогда у меня есть также пользовательский продукт, который рассчитывает количество необходимых панелей на основе показателей пола, указанных клиентом, а затем добавляет в корзину необходимое количество отдельных панелей.

Я хотел бы динамически изменять содержимое корзины при просмотре.

То есть , например, , если конфигуратор пола рассчитывает 54 отдельных панелей и добавив их в корзину, я бы хотел изменить элемент корзины на:

  • 1 Product_4 (30 панелей)
  • 1 Product_2 (12 панелей)
  • 2 Product_1 (1 панель)
  • и распечатайте сообщение с указанием изменений.

Я проверил различные решения, но ни одно из них не предлагает такую ​​функцию:

Итак, основываясь на этой ветке ответов , я думаю, что мне нужно использовать ловушку woocommerce_before_calculate_totals и реализовать логику, но мне нужна помощь, так как я разработчик WordPressnoob.

Обратите внимание, что кнопка добавления в корзину вызывается с помощью Ajax в конфигураторе этажа.th:

jQuery("button.ajax_add_to_cart").attr("data-quantity", parseInt(numLozasrealW * numLozasrealH));

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 22 мая 2018

Код ниже должен помочь, он заменит ваш продукт (количество) на другие ваши продукты.Вам нужно будет установить свой собственный идентификатор продукта, 5 обычных идентификаторов продукта и свое текстовое уведомление.

Код:

add_action( 'woocommerce_add_to_cart', 'action_before_cart', 20, 3 );
function action_before_cart( $cart_item_key, $product_id, $quantity ) {
    // HERE set your specific product ID
    $specific_product_id = 862;

    if( $product_id != $specific_product_id ) return;

    // HERE set your other product IDs related to panels
    $products_panels = array(
        861 => 50, // Product ID => for 50 panels
        860 => 30, // Product ID => for 30 panels
        859 => 18, // Product ID => for 18 panels
        858 => 12, // Product ID => for 12 panels
        857 => 1,  // Product ID => for  1 panel
    );

    // Loop through all "panels" products IDs
    foreach ( $products_panels as $product_id => $panels ) {
        if( $quantity >= $panels ){
            $qty = floor($quantity / $panels);
            $quantity = $quantity % $panels;
            $data = 'Panels: '.$panels.' | Quantity: '.$qty.' | Remain: '.$quantity;
            print_pr($data);
            WC()->cart->add_to_cart( $product_id, $qty );
        }
    }
    // Removing the specific product
    WC()->cart->remove_cart_item( $cart_item_key );

    // HERE set your custom notice text
    wc_add_notice('Here your custom notice text', 'notice');
}

Код содержится в файле function.php вашего активного ребенка.тема (или активная тема).Протестировано и работает.

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

enter image description here

...