为了账号安全,请及时绑定邮箱和手机立即绑定

按 WooCommerce 订单和电子邮件通知上的名称对费用进行排序

按 WooCommerce 订单和电子邮件通知上的名称对费用进行排序

PHP
芜湖不芜 2023-10-15 15:45:40
我需要按名称对费用进行排序,而不是按 WooCommerce 订单中的默认价格进行排序。在 Woocommerce 购物车和结账页面答案代码中使用不同的重新排序多项费用,我成功地按购物车和结账页面中的名称对费用进行排序。但它不适用于订单确认和发送的电子邮件。感谢您的帮助。
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

更新


要按客户订单和电子邮件通知上的名称对费用进行排序,您将使用以下内容:


// 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 文件中。经过测试并有效。


查看完整回答
反对 回复 2023-10-15
  • 1 回答
  • 0 关注
  • 56 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信