在 WooCommerce 订单页面上显示所有可用的运输方式和成本

Display all available shipping methods and costs on WooCommerce Order pages

上一个/相关问题:

目前在我基于 WooCommerce 的网站中,我想在订单编辑页面上显示可用的送货方式和价格。

它没有显示我想要的数据。例如,到目前为止我的代码输出结果为:

方法一
方法 2
方法 3

价格 1
价格 2
价格 3

或者,我希望它显示如下:

方法 1 - 价格 1
方法 2 - $Price 2
方法 3 - $Price 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>';
        }
    }
}

万一有人遇到和我一样的问题,我是这样做的:

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

以下略有不同的代码将显示所有可用运输方式的标签和费用(在一个数组中 | 一个 foreach 循环)

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 文件。已测试并有效。