Woocommerce : программно установите скидку для первого заказанного товара, но на основе запасов

#woocommerce #inventory #discount

Вопрос:

Я создаю веб-сайт, на котором буду продавать некоторые гравюры изобразительного искусства, и я хотел бы установить автоматическую скидку, когда клиент покупает первый оттиск серии. Каждый из моих принтов ограничен 15 экземплярами, и я хотел бы установить скидку 30% на первую продажу (№1/15) каждой серии. Затем для следующих отпечатков (№2 — № 15) цена возвращается к нормальной.

Редактировать :

Я продвинулся в решении своей проблемы ! Я провел некоторое исследование и перепробовал множество разных вещей, и я нашел, как установить желаемую пользовательскую цену на странице моего продукта (обычная цена цена со скидкой) с правилом применять ее только в том случае, если соответствующий товар доступен на складе 15.

обычная цена цена со скидкой

И вот какой код используется :

 // Generating the product "regular price"
add_filter( 'woocommerce_product_get_regular_price', 'dynamic_regular_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_regular_price', 'dynamic_regular_price', 10, 2 );
function dynamic_regular_price( $regular_price, $product ) {
    
    $stock_qte = $product->get_stock_quantity();
    if( empty($regular_price) || $regular_price == 0 )
        return $product->get_price();
    else
        return $regular_price;
}


// Generating the product "sale price"
add_filter( 'woocommerce_product_get_sale_price', 'dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_sale_price', 'dynamic_sale_price', 10, 2 );
function dynamic_sale_price( $sale_price, $product ) {
    
    $stock_qte = $product->get_stock_quantity();
    if( $stock_qte == '15')
        return $product-> get_regular_price() * 0.7;
    else
        //return $product->get_regular_price();
        return $regular_price;
};

// Displayed formatted regular price   sale price
add_filter( 'woocommerce_get_price_html', 'dynamic_sale_price_html', 20, 2 );
function dynamic_sale_price_html( $price_html, $product ) {
    
    $stock_qte = $product->get_stock_quantity();
    if( $stock_qte == '15')
        $price_html = wc_format_sale_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ), wc_get_price_to_display(  $product, array( 'price' => $product->get_sale_price() ) ) ) . $product->get_price_suffix();
    else
        $price_html = wc_price(wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ). $product->get_price_suffix());
    return $price_html;
} 

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

тележка (из мини-тележки)
корзина (страница корзины)

 add_action( 'woocommerce_before_calculate_totals', 'alter_price_cart', 9999 );
function alter_price_cart( $cart ) {
 
    if ( is_admin() amp;amp; ! defined( 'DOING_AJAX' ) ) return;
    
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;
 
    // IF CUSTOMER NOT LOGGED IN, DONT APPLY DISCOUNT
    //if ( ! wc_current_user_has_role( 'customer' ) ) return;
 
    // LOOP THROUGH CART ITEMS amp; APPLY 30% DISCOUNT
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $price = $product->get_price();
        $cart_item['data']->set_price( $price * 0.7 );
    }
} 

Мне также придется добавить логику наличия запасов для страницы мини-корзины / корзины / оформления заказа, но я сделаю это во второй раз.

Должно быть, я допустил некоторые ошибки в цикле по всей корзине, но я не могу уловить проблему 🙁 Есть идеи о том, как зацепить цену каждого товара и изменить отображаемое значение ?

Хорошего дня,

Квентин

Комментарии:

1. Для контекста: помимо номера, отпечатки являются одним и тем же продуктом WooCommerce? Вы устанавливаете запас/инвентарь на 15 штук, чтобы избежать покупки большего количества? Если нет, то как вы ограничиваете суммы для продажи?

2. Каждый отпечаток представлен отдельным переменным продуктом (выбор размера и обрамления), а запас ограничен 15 на уровне продукта. Опция заказа на пополнение запасов не допускается, чтобы избежать заказа уже завершенных серий.