#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 на уровне продукта. Опция заказа на пополнение запасов не допускается, чтобы избежать заказа уже завершенных серий.