จัดเรียงค่าธรรมเนียมตามชื่อในคำสั่งซื้อ WooCommerce และการแจ้งเตือนทางอีเมล

Aug 17 2020

ฉันต้องการจัดเรียงค่าธรรมเนียมตามชื่อแทนที่จะเป็นค่าเริ่มต้นตามราคาในคำสั่งซื้อ WooCommerce

การใช้การจัดลำดับค่าธรรมเนียมหลายรายการที่แตกต่างกันในรหัสคำตอบรถเข็นของ Woocommerce และหน้าชำระเงินฉันจัดการจัดเรียงค่าธรรมเนียมตามชื่อในรถเข็นและหน้าชำระเงิน แต่ใช้ไม่ได้กับการยืนยันคำสั่งซื้อและอีเมลที่ส่งออกไป

ขอขอบคุณสำหรับความช่วยเหลือของคุณ.

คำตอบ

LoicTheAztec Aug 17 2020 at 13:46

อัปเดตแล้ว

ในการจัดเรียงค่าธรรมเนียมตามชื่อในใบสั่งซื้อของลูกค้าและการแจ้งเตือนทางอีเมลคุณจะใช้สิ่งต่อไปนี้:

// Custom function that sort displayed fees by name on order items
function wc_get_sorted_order_item_totals_fee_rows( &$total_rows, $tax_display, $order ) { $fees = $order->get_fees(); if ( $fees ) {
        $fee_names = []; // initializing // First Loop foreach ( $fees as $fee_id => $fee ) {
            $fee_names[$fee_id] = $fee->get_name(); } asort($fee_names); // Sorting by name

        // 2nd Loop
        foreach ( $fee_names as $fee_id => $fee_name ) { $fee = $fees[$fee_id];

            if ( apply_filters( 'woocommerce_get_order_item_totals_excl_free_fees', empty( $fee['line_total'] ) && empty( $fee['line_tax'] ), $fee_id ) ) { continue; } $total_rows[ 'fee_' . $fee->get_id() ] = array( 'label' => $fee->get_name() . ':',
                'value' => wc_price( 'excl' === $tax_display ? $fee->get_total() : $fee->get_total() + $fee->get_total_tax(), array( 'currency' => $order->get_currency() ) ), ); } } } // Display sorted fees by name everywhere on orders and emails add_filter( 'woocommerce_get_order_item_totals', 'display_date_custom_field_value_on_order_item_totals', 10, 3 ); function display_date_custom_field_value_on_order_item_totals( $total_rows, $order, $tax_display ){
    // Initializing variables
    $new_total_rows = $item_fees = [];

    // 1st Loop - Check for fees
    foreach ( $total_rows as $key => $values ) { if( strpos($key, 'fee_') !== false ) {
            $item_fees[] = $key;
        }
    }

    if( count($item_fees) > 1 ) { // 2nd Loop - Remove item fees total lines foreach ( $item_fees as $key ) { unset($total_rows[$key]); } $key_start = isset($total_rows['shipping']) ? 'shipping' : ( isset($total_rows['discount']) ? 'discount' : 'cart_subtotal' );

        // 3rd Loop - loop through order total rows
        foreach( $total_rows as $key => $values ) { $new_total_rows[$key] = $values;

            // Re-inserting sorted fees
            if( $key === $key_start ) {
                wc_get_sorted_order_item_totals_fee_rows( $new_total_rows, $tax_display, $order ); } } return $new_total_rows;
    }
    return $total_rows;
}

โค้ดจะอยู่ในไฟล์ functions.php ของธีมลูกที่ใช้งานอยู่ (หรือธีมที่ใช้งานอยู่) ผ่านการทดสอบและใช้งานได้จริง