Ordene las tarifas por nombre en pedidos de WooCommerce y notificaciones por correo electrónico
Aug 17 2020
Necesito ordenar las tarifas por nombre en lugar del precio predeterminado en los pedidos de WooCommerce.
Usando Reordenar múltiples tarifas de manera diferente en el carrito de Woocommerce y el código de respuesta de las páginas de pago , he logrado clasificar las tarifas por nombre en el carrito y las páginas de pago. Pero no funciona para la confirmación del pedido y los correos electrónicos que se envían.
Gracias por tu ayuda.
Respuestas
LoicTheAztec Aug 17 2020 at 13:46
Actualizado
Para ordenar las tarifas por nombre en los pedidos de los clientes y las notificaciones por correo electrónico, utilizará lo siguiente:
// 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;
}
El código va en el archivo functions.php de su tema hijo activo (o tema activo). Probado y funciona.