Ordina le tariffe per nome negli ordini WooCommerce e nelle notifiche e-mail

Aug 17 2020

Devo ordinare le tariffe per nome piuttosto che per prezzo predefinito negli ordini WooCommerce.

Utilizzando il riordino di più tariffe in modo diverso nel carrello di Woocommerce e nel codice di risposta delle pagine di pagamento , sono riuscito a ordinare le tariffe per nome nel carrello e nelle pagine di pagamento. Ma non funziona per la conferma dell'ordine e le e-mail che vengono inviate.

Grazie per l'aiuto.

Risposte

LoicTheAztec Aug 17 2020 at 13:46

Aggiornato

Per ordinare le tariffe in base al nome sugli ordini dei clienti e sulle notifiche e-mail, utilizzerai quanto segue:

// 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;
}

Il codice va nel file functions.php del tema figlio attivo (o tema attivo). Testato e funziona.