Я использую этот код в файле functions.php, чтобы применить 10% скидку на мои товары, начиная со второго в корзине:
function add_discount_price_percent( $cart_object ) {
global $woocommerce;
$pdtcnt=0;
foreach ($woocommerce->cart->get_cart() as $cart_item_key => $cart_item) {
$pdtcnt++;
$oldprice = 0;
$newprice = 0;
if($pdtcnt>1) { // from second product
$oldprice = $cart_item['data']->price; //original product price
// echo "$oldprice<br />";
$newprice = $oldprice*0.9; //discounted price
$cart_item['data']->set_sale_price($newprice);
$cart_item['data']->set_price($newprice);
$cart_item['data']->set_regular_price($oldprice);
}
}
WC()->cart->calculate_totals();
}
add_action( 'woocommerce_before_cart', 'add_discount_price_percent', 1);
add_action( 'woocommerce_before_checkout_form', 'add_discount_price_percent', 99 );
Цены отображаются корректно как в корзине, так и на странице оформления заказа, но когда я проверяю свой платеж в песочнице PayPal, я вижу и должен заплатить полную стоимость, так как скидка игнорируется.
Если я подтверждаю цены со скидкой непосредственно перед кнопкой отправки, я получаю правильные цены:
function echo_discount_before_checkout_submit() {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
foreach ( WC()->cart->get_cart() as $key => $value ) {
echo $value['data']->price . "<br />";
}
}
add_action( 'woocommerce_review_order_before_submit', 'echo_discount_before_checkout_submit', 99 );
Как я могу отправить правильные цены со скидкой в PayPal?
РЕДАКТИРОВАТЬ: @LoisTheAtzec ответ действительно хороший, но мне нужно получить скидку 10% даже на первый продукт, если количество превышает 2: я пытаюсь этот код, но я не могу получить правильные значения.
// If it is the first product and quantity is over 1
if ($count === 1 && $cart_item['quantity'] >= 2) {
// get unit price
$unit_price = $cart_item['data']->get_price();
// get quantity to discount (total - 1)
$discounted_quantity = $cart_item['quantity'] - 1;
// get total discount amount (on total quantity - 1)
$discounted_amount = ($unit_price * $discounted_quantity) * 0.9;
// add first non discounted price to total discount amount
$total_discounted_price = $unit_price + $discounted_amount;
// distribute discount over total quantity and get new unit price
$distributed_unit_discount = $total_discounted_price / $cart_item['quantity'];
// set new unit price
$cart_item['data']->set_price($distributed_unit_discount);
}
ОБНОВЛЕНИЕ 09-06-2018
Я получил странное поведение с вошедшими в систему пользователями, возможно, в зависимости от некоторого конфликта между плагинами или с темой, которую я использовал (Avada): скидка применялась дважды, поэтому мне пришлось не допустить добавления этого кода в мою функцию:
// Set the discounted price on 2nd item and
add_action('woocommerce_before_calculate_totals', 'add_discount_percentage_on_2nd_item', 999, 1);
function add_discount_percentage_on_2nd_item($cart) {
if (is_admin() && !defined('DOING_AJAX'))
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
Надеюсь, это поможет.