Woocommerce добавляет комиссию вне корзины

Я хочу добавить комиссию к заказу woocommerce. Я нашел много примеров этого:

$ woocommerce-> корзина-> add_fee ()

Но мне нужно добавить комиссию к существующему (обрабатываемому или запланированному) заказу из функции.

могу я просто вызвать add_fee ()

Например, если я хочу добавить комиссию в размере 15 долларов США, которая не облагается налогом, я могу просто сделать что-то вроде add_fee ('Option Adjustment', 15, $ taxable = false, $ tax_class = '')

Проблема, конечно, в том, что add_fee вне корзины не может сказать, к какому заказу я хочу добавить комиссию.

Я смотрел на это: http://woocommerce.wp-a2z.org/oik_api/wc_abstract_orderadd_fee/, что заставляет меня задуматься, могу ли я каким-то образом вызвать add_fee из WC_Abstract_order, используя что-то вроде:

$ order = новый WC_Order ($ order_id);

Но я не уверен, каковы будут особенности и синтаксис.

Любая помощь будет очень высоко ценится!


person MJJ    schedule 04.05.2016    source источник
comment
Это не сработает для меня, потому что мне нужно, чтобы плата вписывалась в кусок кода, который я пишу. В итоге я кое-что придумал. Поделюсь ниже.   -  person MJJ    schedule 07.05.2016


Ответы (1)


Мне удалось успешно добавить плату за woocommerce из моего functions.php, используя следующее. В частности, я вызываю его внутри действия «gform_after_submission», чтобы скорректировать запланированный платеж, если пользователь редактирует свои параметры, связанные с ценой, с помощью формы Gravity.

Примечание. Требуется идентификатор заказа ($ order_id) для заказа woocommerce, к которому вы хотите добавить комиссию.

1. Настройте объект комиссии woocommerce.

$feename = 'Option Adjustment';
$feeamount = 40;
//The following sets up the fee object in a format accepted by woocommerce
$fee = array('name' => $feename, 'amount' => $feeamount, 'taxable' => false, 'tax_class' => '');

2. Вызовите функцию, которая добавляет комиссию (№3).

blb_add_fee($fee, $order_id);

3. Функция, которая добавляет плату (адаптировано из http://woocommerce.wp-a2z.org/oik_api/wc_abstract_orderadd_fee/)

function blb_add_fee( $fee, $order_id ) { 

    $item_id = wc_add_order_item( $order_id, array( 
        'order_item_name' => $fee['name'],  
        'order_item_type' => 'fee' 
    ) ); 

    if ( ! $item_id ) { 
        return false; 
    } 

    if ( $fee['taxable'] ) { 
        wc_add_order_item_meta( $item_id, '_tax_class', $fee['tax_class'] ); 
    } else { 
        wc_add_order_item_meta( $item_id, '_tax_class', '0' ); 
    } 

    wc_add_order_item_meta( $item_id, '_line_total', wc_format_decimal( $fee['amount'] ) ); 
    wc_add_order_item_meta( $item_id, '_line_tax', wc_format_decimal( $fee['tax'] ) ); 

    // Save tax data - Since 2.2 
    $tax_data = array_map( 'wc_format_decimal', $fee['tax_data'] ); 
    wc_add_order_item_meta( $item_id, '_line_tax_data', array( 'total' => $tax_data ) ); 

    do_action( 'woocommerce_order_add_fee', $order_id, $item_id, $fee ); 

//Remove the following line (blb_calculate_totals) if you dont need to recalculate your totals
    blb_calculate_totals( $and_taxes = false, $order_id );

    return $item_id; 

} 

4. Наконец, вы можете захотеть пересчитать свои итоги (названные выше с использованием «blb_calculate_totals» и адаптированные из http://woocommerce.wp-a2z.org/oik_api/wc_abstract_ordercalculate_totals/)

function blb_calculate_totals( $and_taxes = false, $order_id ) { 

    $cart_subtotal = 0; 
    $cart_total = 0; 
    $fee_total = 0; 
    $cart_subtotal_tax = 0; 
    $cart_total_tax = 0; 

    /*
    if ( $and_taxes && wc_tax_enabled() ) { 
        $this->calculate_taxes(); 
    } 
    */

    // line items 
    $order = new WC_Order( $order_id );
    foreach ( $order->get_items() as $item ) { 
        $cart_subtotal     += wc_format_decimal( isset( $item['line_subtotal'] ) ? $item['line_subtotal'] : 0 ); 
        $cart_total        += wc_format_decimal( isset( $item['line_total'] ) ? $item['line_total'] : 0 ); 
        $cart_subtotal_tax += wc_format_decimal( isset( $item['line_subtotal_tax'] ) ? $item['line_subtotal_tax'] : 0 ); 
        $cart_total_tax    += wc_format_decimal( isset( $item['line_tax'] ) ? $item['line_tax'] : 0 ); 
    } 

    //$this->calculate_shipping(); 

    foreach ( $order->get_fees() as $item ) { 
        $fee_total += $item['line_total']; 
    } 

    $order->set_total( $cart_subtotal - $cart_total, 'cart_discount' ); 
    $order->set_total( $cart_subtotal_tax - $cart_total_tax, 'cart_discount_tax' ); 

    $grand_total = round( $cart_total + $fee_total + $order->get_total_shipping() + $order->get_cart_tax() + $order->get_shipping_tax(), wc_get_price_decimals() ); 

    $order->set_total( $grand_total, 'total' ); 

    return $grand_total; 
} 
person MJJ    schedule 07.05.2016