Установите цену товара со скидкой, которая будет отражена в Заказах в Woocommerce 3 - PullRequest
0 голосов
/ 28 августа 2018

Я использую этот код в файле 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; 

Надеюсь, это поможет.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

В объекте корзины единственное, что вы действительно можете изменить и получить эффект, это активная цена .
Изменение обычной или продажной цены товаров в корзине не имеет значения.

Попробуйте следующее, что изменит цену со 2-й корзины и выше, и данные будут правильно переданы в Paypal:

// Calculate and save as custom cart item data the discounted price
add_filter('woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 20, 3);

function add_custom_cart_item_data($cart_item_data, $product_id, $variation_id) {
    // HERE set the percentage rate to be applied to get the new price
    $percentage = 10; // 10%

    $_product_id = $variation_id > 0 ? $variation_id : $product_id;

    $product = wc_get_product($_product_id); // The WC_Product Object
    $base_price = (float) $product->get_price(); // Get the product active price

    // Save the calculated discounted price as custom cart item data
    $cart_item_data['discounted_price'] = $base_price * ( 100 - $percentage ) / 100;

    return $cart_item_data;
}

// Set the discounted price on 2nd item and
add_action('woocommerce_before_calculate_totals', 'add_discount_percentage_on_2nd_item', 20, 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;

    $count = 0;

    // Loop through cart items
    foreach($cart->get_cart() as $cart_item) {
        $count++; // Increasing

        // On 2nd cart item or more set the calculated discounted price
        if ($count >= 2 && isset($cart_item['discounted_price']))
            $cart_item['data']->set_price($cart_item['discounted_price']);
    }
}

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


Дополнение - получите скидку на все товары, если количество товаров в корзине превышает 2.

Вы будете использовать тот же код первой подключенной функции, что и выше.
Вы замените 2-ю подключенную функцию следующим:

// Set a discounted price on cart items when cart content count is over 2
add_action('woocommerce_before_calculate_totals', 'add_discount_percentage_on_2nd_item', 20, 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;

    // Get the total items count
    $total_count = $cart->get_cart_contents_count();

    // if total count is below 2 we exit
    if( $total_count < 2 ) 
        return; // Exit

    // Loop through cart items
    foreach($cart->get_cart() as $cart_item) {

        // Set the calculated discounted price
        if (isset($cart_item['discounted_price']))
            $cart_item['data']->set_price($cart_item['discounted_price']);
    }
}

Код помещается в файл function.php активной дочерней темы (или активной темы). Должно работать.


Сложение 2

  • Только первая корзина является полной ценой, и для следующих товаров скидка предоставляется в следующих количествах)
  • Все товары из корзины тритона обесценены.

код:

// Calculate and save as custom cart item data the discounted price
add_filter('woocommerce_add_cart_item_data', 'add_custom_cart_item_data', 20, 3);

function add_custom_cart_item_data($cart_item_data, $product_id, $variation_id) {
    // HERE set the percentage rate to be applied to get the new price
    $percentage = 10; // 10%

    $_product_id = $variation_id > 0 ? $variation_id : $product_id;

    $product = wc_get_product($_product_id); // The WC_Product Object
    $base_price = (float) $product->get_price(); // Get the product active price

    // Save the normal active product price as custom cart item data
    $cart_item_data['normal_price'] = $base_price;

    // Save the calculated discounted price as custom cart item data
    $cart_item_data['discounted_price'] = $base_price * ( 100 - $percentage ) / 100;

    return $cart_item_data;
}

// Set the discounted price on 2nd item and
add_action('woocommerce_before_calculate_totals', 'add_discount_percentage_on_2nd_item', 20, 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; 

    // Initializing variables
    $count = 0;
    $first_item = true

    // Loop through cart items
    foreach($cart->get_cart() as $cart_item) {
        // 1. First cart item
        if ( isset($cart_item['discounted_price']) && isset($cart_item['normal_price']) && $first_item ){
            if( $cart_item['quantity'] > 1 ){
                $normal_price   = (float) $cart_item['normal_price'];
                $discount_price = (float) $cart_item['discounted_price'];
                $quantity       = (int) $cart_item['quantity'];

                // The first item is at full price and others at discounted price
                $cart_item['data']->set_price( $normal_price + ( $discount_price * ($quantity - 1) ) );
            }
            $first_item = false; // We switch it to false as it is the first cart item
        }
        // 2. All next items (at discounted price
        elseif ( isset($cart_item['discounted_price']) && ! $first_item ){
            // Set the discounted price
            $cart_item['data']->set_price($cart_item['discounted_price']);
        }
    }
}

Код помещается в файл function.php активной дочерней темы (или активной темы). Должно работать.

0 голосов
/ 28 августа 2018

платежный шлюз принимает "normal_price", и вы передали ему старую цену.
Попытайтесь установить регулярную цену с новой ценовой переменной, возможно это может работать.

//update _regular_price
$wpdb->update( 
    $wpdb->postmeta, 
    array( 'meta_value' => $default_product_price ), 
    array( 'meta_key' => '_regular_price' )
);

ИЛИ обновите цену в БД согласно приведенному выше коду. Это, безусловно, поможет вам.

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