Изменение суммы скидки купона WooCommerce в корзине - PullRequest
0 голосов
/ 14 июля 2020

Что я делаю: Я создаю промо-акцию на основе купонов. Купон предоставит скидку 10% на самый дорогой товар в корзине, который относится к определенной c категории продукта.

Проблема: Код ниже успешно проверяет, есть ли в корзине товары из указанной категории c и получает 10% от цены самого дорогого продукта из этого массива для использования в качестве скидки. Однако я не могу изменить сумму купонной скидки в корзине.

Код:

function change_coupon_price_for_promo( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) ){
        return;
    }
    
    // coupon code
    $coupon_name = 'MYCOUPONNAME'; 
    
    // if coupon is applied to cart...
    if( $cart->has_discount( $coupon_name ) ) {
        
        // Form array of products from the cart that belong to the specified category
        $specProduct = array(); // array of specific products in cart
        foreach ( $cart->get_cart() as $key => $cart_item ) {
            $cart_item_id = $cart_item['product_id'];
            $terms = wp_get_post_terms( $cart_item_id, 'product_cat' );
            foreach ( $terms as $term ){
                // gets product cat id
                $product_cat_id = $term->term_id;
                // gets an array of all parent category levels
                $product_parent_categories_all_hierachy = get_ancestors( $product_cat_id, 'product_cat' );      
                // This cuts the array and extracts the last set in the array
                $last_parent_cat = array_slice($product_parent_categories_all_hierachy, -1, 1, true);
                if(in_array(3831, $last_parent_cat)){
                    $specProduct[$key] = $cart_item_id;
                    break;
                }
            }
        }
        
        //if there are items from the specific category in the cart
        if(!empty($specProduct)){
            $specPriceArray = array(); // array of specific product prices in cart
            foreach ($specProduct as $key => $specItem) {
                $thisProd = wc_get_product($specItem);
                $thisPrice = $thisProd->get_price();
                $specPriceArray[$key] = $thisPrice;
            }
            
            // most expensive specific product price
            $highestSpec = max($specPriceArray);
            // discount of most expensive item
            $finalDiscount = $highestSpec * .1;
            
            // print_r($specProduct); GOOD
            // print_r($specPriceArray); GOOD
            // echo $highestSpec; GOOD
            // echo $finalDiscount; GOOD

            /***** APPLY COUPON CHANGE HERE<-------HOW??? *****/
            $cart->discount_total = $finalDiscount;
        }
    }
}
add_action( 'woocommerce_before_calculate_totals', 'change_coupon_price_for_promo', 10, 1 ); 

Я спрашиваю:

Последняя строка кода перед закрывающими скобками ...

$ cart-> Discount_total = $ finalDiscount;

- это то, что я пытался использовать, чтобы изменить скидку по купону в корзине. Не работает. Как я могу сделать это sh? TY.

EDIT: Я должен отметить, что добавляемый купон настроен как «Фиксированная скидка корзины» со ставкой 0, поэтому он добавляется как позиция в заказ . Таким образом, пользователь увидит скидку по коду купона в отдельной строке корзины / кассы.

1 Ответ

0 голосов
/ 14 июля 2020

вы можете использовать функцию set_price. вы можете вызвать его в своем коде, например:

$cart_item['data']->set_price('New price here')

используйте его внутри foreach, который зацикливает элементы вашей корзины

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