Скидка на оптовое количество корзины для определенных товаров в Woocommerce

В woocommerce я пытаюсь сделать индивидуальную скидку на количество товаров в тележке только для определенного идентификатора продукта. Вот что я пытаюсь сделать:
Если покупатель добавляет в корзину конкретный товар, я хотел бы сохранить исходную цену для первого товара и установить специальную цену со скидкой для каждого дополнительного количества товара.

Например:

  • Активная цена товара - 40 (мы сохраняем эту цену для 1-го количества товара).
  • При количестве до 2 (количество дополнительных позиций) цена 12.

Таким образом, если покупатель добавит товар в количестве 5 штук, то цена будет:
40 + 12 + 12 + 12 + 12 = 88.

Поэтому я попытался немного изменить этот код ответа:
Прогрессивная процентная скидка на количество товаров в корзине в Woocommerce 3

Но не смог заставить его работать правильно.

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


person Rinkul    schedule 24.09.2018    source источник


Ответы (1)


В вашем случае вместо этого используйте следующее:

add_filter('woocommerce_add_cart_item_data', 'add_items_default_price_as_custom_data', 20, 3 );
function add_items_default_price_as_custom_data( $cart_item_data, $product_id, $variation_id ){

    ## Your settings her below ##
    $product_ids = array(37); // <=== Your specific product(s) ID(s) in the array
    $discounted_price = 12; // <=== The specific product discounted price

    // The WC_Product Object
    $product = wc_get_product($variation_id > 0 ? $variation_id : $product_id);

    if( array_intersect( $product_ids, array($product_id, $variation_id) ) && ! $product->is_on_sale() ){
        // We set the Product discounted price
        $cart_item_data['pricing']['discounted'] = $discounted_price;

        // Set the Product default base price as custom cart item data
        $cart_item_data['pricing']['active'] = $product->get_price();
    }

    return $cart_item_data;
}

// Display the product original price
add_filter('woocommerce_cart_item_price', 'display_cart_items_default_price', 20, 3 );
function display_cart_items_default_price( $product_price, $cart_item, $cart_item_key ){
    if( isset($cart_item['pricing']['active']) && $cart_item['quantity'] > 1 ) {
        $product_price  = wc_price( wc_get_price_to_display( $cart_item['data'], array( 'price' => $cart_item['pricing']['active'] ) ) );
    }
    return $product_price;
}

// Display the product name with the a custom "discount" label
add_filter( 'woocommerce_cart_item_name', 'append_custom_label_to_item_name', 20, 3 );
function append_custom_label_to_item_name( $product_name, $cart_item, $cart_item_key ){
    if( isset($cart_item['pricing']['discounted']) && $cart_item['data']->get_price() != $cart_item['pricing']['discounted'] ) {
        $discounted_price = (float) $cart_item['pricing']['discounted'];
        $default_price    = (float) $cart_item['pricing']['active'];
        $quantity         = (int)   $cart_item['quantity'];

        // Calculate new product price
        $new_price = ($default_price + ($discounted_price * ($quantity - 1))) / $quantity;

        // Get the discount percentage (if needed)
        $percent = 100 - ($new_price / $default_price * 100);

        $product_name .= ' <em>(' . __('quantity discounted', 'woocommerce') . ')</em>';
    }
    return $product_name;
}

// Set the new discounted price
add_action( 'woocommerce_before_calculate_totals', 'set_custom_discount_cart_item_price', 25, 1 );
function set_custom_discount_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach( $cart->get_cart() as $cart_item ){

        // For items non on sale set a discount based on quantity
        if( isset($cart_item['pricing']['discounted']) && $cart_item['quantity'] > 1 ) {
            $discounted_price = (float) $cart_item['pricing']['discounted'];
            $default_price    = (float) $cart_item['pricing']['active'];
            $quantity         = (int)   $cart_item['quantity'];

            // Calculate new product price
            $new_price = ($default_price + ($discounted_price * ($quantity - 1))) / $quantity;

            // Set cart item calculated price
            $cart_item['data']->set_price($new_price);
        }
    }
}

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

person LoicTheAztec    schedule 24.09.2018
comment
Идеальный партнер. Большое спасибо, вопрос: есть ли у меня несколько товаров с одинаковой оптовой скидкой? Могу ли я добавить к нему еще идентификатор продукта? - person Rinkul; 24.09.2018
comment
@Rinkul Я ожидал, что ... так что да, как вы видите, вы можете добавить несколько идентификаторов продуктов в массив (в разделе настроек), например $product_ids = array(37, 43, 57); - person LoicTheAztec; 24.09.2018
comment
@Rinkul Извините, но это большой коммерческий плагин, и я не могу с этим помочь, так как не знаю, как он работает. Мой код работает с обычными продуктами Woocommerce. При использовании сторонних плагинов всегда возникает проблема с настройкой, особенно с большинством плагинов Code-canyon. - person LoicTheAztec; 25.09.2018
comment
@Rinkul, пожалуйста, не оскорбляйте пользователей. Люди добровольно жертвуют своим временем, они не готовы удовлетворить ваши потребности. - person ; 25.09.2018