Отображение всех доступных способов доставки и стоимости на страницах заказов WooCommerce - PullRequest
0 голосов
/ 09 июля 2020

Предыдущий / связанный вопрос: Отображать ВСЕ доступные способы доставки для каждой спецификации c заказ на страницах редактирования заказа администратора в Woocommerce

В настоящее время в моем WooCommerce site, я хочу отображать доступные способы доставки и цены на странице редактирования заказа.

Он не отображает данные так, как я хочу. Например, результат моего кода на данный момент:

Метод 1
Метод 2
Метод 3

Цена 1
Цена 2
Цена 3

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

Метод 1 - Цена 1 в долларах
Метод 2 - Цена в долларах 2
Метод 3 - Цена 3

Я понимаю, почему это отображается таким образом, но мне было любопытно, как я могу повторять циклы одновременно и форматировать их, а не один за другим.

Это мой код:

add_action( 'woocommerce_admin_order_data_after_shipping_address', 'action_woocommerce_admin_order_data_after_shipping_address', 10, 1 );
function action_woocommerce_admin_order_data_after_shipping_address( $order ){
    // Get meta
    $rate_labels = $order->get_meta( '_available_shipping_methods' );
    $rate_costs = $order->get_meta( '_available_shipping_method_cost' );
    
    $methods = array ( $rate_labels, $rate_costs );
    
    // True
    if ( $rate_labels ) {
        // Loop
        echo '<p><strong>Shipping Methods: </strong>';
        foreach( $rate_labels as $rate_label ) {
            // Output
            echo '<p>' . $rate_label . '</p>';
        }
        foreach( $rate_costs as $rate_cost ) {
            // Output
            echo '<p> $' . $rate_cost . '</p>';
        }
    }
}

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Следующий немного отличающийся код будет отображать этикетку и стоимость всех доступных способов доставки (в одном массиве | один для каждого l oop) :

add_action( 'woocommerce_checkout_create_order', 'action_wc_checkout_create_order' );
function action_wc_checkout_create_order( $order ) {
    $shipping_data = array(); // Initializing

    // Get shipping packages keys from cart
    $packages_keys = (array) array_keys(WC()->cart->get_shipping_packages());

    // Loop through shipping packages keys (when cart is split into many shipping packages)
    foreach( $packages_keys as $key ){
        // Get available shipping rates from WC_Session
        $shipping_rates = WC()->session->get('shipping_for_package_'.$key)['rates'];

        // Loop through shipping rates
        foreach( $shipping_rates as $rate_key => $rate ){
            // Set all related shipping rate data in the array
            $shipping_data[] = array(
                'id'          => $rate_key,
                'method_id'   => $rate->method_id,
                'instance_id' => (int) $rate->instance_id,
                'label'       => $rate->label,
                'cost'        => (float) $rate->cost,
                'taxes'       => (array) $rate->taxes,
                'package_key' => (int) $key,
            );
        }
    }

    // Save shipping data as order custom field
    if( ! empty($shipping_data) ) {
        $order->update_meta_data( '_shipping_data', $shipping_data );
    }
}

add_action( 'woocommerce_admin_order_data_after_shipping_address', 'available_shipping_rates_after_shipping_address' );
function available_shipping_rates_after_shipping_address( $order ) {
    // Get shipping rates custom meta data
    $shipping_data = $order->get_meta( '_shipping_data' );

    if ( ! empty($shipping_data) ) {
        echo '<p><strong>Shipping Methods: </strong><br>';

        // Loop through shipping rates data
        foreach( $shipping_data as $rate ) {
            // Calculate cost with taxes
            $rate_cost = $rate['cost'] + array_sum($rate['taxes']);

            // Output
            echo $rate['label'] . ( $rate_cost > 0 ? ': '. wc_price($rate_cost) : '' ) . '<br>';
        }

        echo '</p>';
    }
}

Код идет в файле functions. php вашей активной дочерней темы (или активной темы). Проверено и работает.

0 голосов
/ 09 июля 2020

Если у кого-то возникнет тот же вопрос, что и у меня, вот как я это сделал:

function action_woocommerce_admin_order_data_after_shipping_address( $order ) {
    // Get meta
    $rate_labels = $order->get_meta( '_available_shipping_methods' );
    $rate_costs = $order->get_meta( '_available_shipping_method_cost' );
    
    $methods = array ( $rate_labels, $rate_costs );
    
    // True
    if ( $rate_labels ) {
        // Loop
        echo '<p><strong>Shipping Methods: </strong>';
        foreach(array_combine($rate_labels, $rate_costs) as $rate_label => $rate_cost) {
             echo '<p>' . $rate_label . ' - $' . $rate_cost . '</p>';
        }
    }
    
}
...