首页 > 解决方案 > 在 Woocommerce 的管理员编辑订单页面上显示每个特定订单的所有可用运输方式

问题描述

在我的基于 WooCommerce 的网站的结帐页面上,用户将有一个运输方式列表可供选择,具体取决于他们购买的商品

这是我要捕获的列表:

这是我要捕获的列表


我的目标是显示每个特定订单的所有可用方法,并将其显示在管理视图的“编辑订单/订单详细信息”页面上。

一个小功能可以帮助我们快速识别人们更常选择的选项,具体取决于他们可用的选项。

这是我到目前为止所拥有的:

add_action( 'woocommerce_checkout_update_order_meta', 'save_available_shipping_methods' );
 
function save_available_shipping_methods( $order_id ) {
    $shippingmethods = WC()->cart->get_shipping_methods();
    update_post_meta( $order_id, '_shipping_methods', $shippingmethods );
}

add_action( 'woocommerce_admin_order_data_after_shipping_address', 'get_available_shipping_methods', 10, 1 );

function get_available_shipping_methods($order){
    $order = wc_get_order( $order_id );
    if ( $order ) {
        echo '<p><strong>'.__('Available Shipping Methods: ').'</strong> ' . get_post_meta($order->get_shipping_methods(), '_shipping_field_value', true ) . '</p>';
    }
}

我也会附上一张图片,也许会让事情更容易理解。

这是我想放的地方。当前挂钩将字段置于送货地址下方

这是我想放的地方。 当前挂钩将字段置于送货地址下方

标签: phpwordpresswoocommerceordersshipping-method

解决方案


  • woocommerce_checkout_update_order_meta挂钩中,可用的运输包裹通过以下方式存储update_post_meta
  • 在代码中添加解释的注释
function action_woocommerce_checkout_update_order_meta( $order_id ) {
    // Get shipping packages
    $packages = WC()->shipping()->get_packages();
    
    // Set array
    $rate_labels = array();
    
    // Loop trough packages
    foreach ( $packages as $key => $package ) {
        // Loop through package rates
        foreach( $package['rates'] as $rate_id => $rate ) {
            // Push to array
            $rate_labels[] = $rate->get_label();
        }
    }

    // NOT empty
    if ( ! empty ( $rate_labels ) ) {
        // Update post meta
        update_post_meta( $order_id, '_available_shipping_methods', $rate_labels );
    }
}
add_action( 'woocommerce_checkout_update_order_meta', 'action_woocommerce_checkout_update_order_meta', 10, 1 ); 

// Display on the order edit page (backend)
function action_woocommerce_admin_order_data_after_shipping_address( $order ) {
    // Get meta
    $rate_labels = $order->get_meta( '_available_shipping_methods' );
    
    // True
    if ( $rate_labels ) {
        // Loop trough rate labels
        foreach( $rate_labels as $rate_label ) {
            // Output
            echo '<p>' . $rate_label . '</p>';
        }
    }
}
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'action_woocommerce_admin_order_data_after_shipping_address', 10, 1 );

推荐阅读