如何在WooCommerce订单编辑页面仅显示指定的单个配送类别
实现WooCommerce订单编辑页优先显示指定配送类别
嘿,这个需求很好解决——核心就是给你的配送类别设置一个优先级规则:让DPD拥有最高优先级,只要订单里存在带DPD配送类别的商品,就只显示它;只有当订单里没有DPD商品时,再考虑显示DHL(或者其他类别)。
具体实现思路
- 遍历订单内的所有商品,收集所有关联的配送类别(自动去重,避免重复显示)
- 先检查收集到的类别中是否包含DPD:
- 如果有,直接只保留DPD这一个类别
- 如果没有,再检查是否存在DHL,存在则保留DHL
- 最后把筛选后的类别渲染到订单编辑页面
修改后的代码示例
假设你之前是用woocommerce_admin_order_data_after_order_details钩子来显示配送类别,那可以替换成下面的代码(记得根据你的实际配送类别slug调整参数):
add_action( 'woocommerce_admin_order_data_after_order_details', 'display_priority_shipping_category_on_order_edit_page' ); function display_priority_shipping_category_on_order_edit_page( $order ) { // 配置优先级:第一个是最高优先级的类别,第二个是备选 $priority_category_slug = 'dpd'; // 替换成你的DPD配送类别slug $fallback_category_slug = 'dhl'; // 替换成你的DHL配送类别slug $shipping_categories = array(); // 遍历订单中的每个商品,收集所有配送类别 foreach ( $order->get_items() as $item ) { $product = $item->get_product(); if ( ! $product ) continue; $shipping_classes = get_the_terms( $product->get_id(), 'product_shipping_class' ); if ( $shipping_classes && ! is_wp_error( $shipping_classes ) ) { foreach ( $shipping_classes as $class ) { // 用slug作为数组键,自动去重 $shipping_categories[ $class->slug ] = $class->name; } } } // 应用优先级规则筛选类别 $display_classes = array(); if ( isset( $shipping_categories[ $priority_category_slug ] ) ) { // 存在DPD,只保留它 $display_classes[ $priority_category_slug ] = $shipping_categories[ $priority_category_slug ]; } elseif ( isset( $shipping_categories[ $fallback_category_slug ] ) ) { // 没有DPD,显示DHL $display_classes[ $fallback_category_slug ] = $shipping_categories[ $fallback_category_slug ]; } // 如果两个都没有,$display_classes为空,就不显示 // 渲染到页面 if ( ! empty( $display_classes ) ) { echo '<div class="order_data_column">'; echo '<h4>' . __( 'Shipping Category', 'woocommerce' ) . '</h4>'; echo '<p><strong>' . implode( ', ', $display_classes ) . '</strong></p>'; echo '</div>'; } }
关键注意事项
- 配送类别slug调整:你需要登录WordPress后台,进入「WooCommerce → 设置 → 配送 → 配送类别」,查看对应类别的slug,替换代码里的
$priority_category_slug和$fallback_category_slug - 如果用类别名称判断:如果你习惯用类别名称而不是slug,把代码里的
$class->slug换成$class->name,同时把变量值改成对应的名称(比如$priority_category_slug = 'DPD',注意大小写要匹配) - 扩展多个类别:如果以后需要加更多优先级类别,只需要在代码里添加判断逻辑即可,比如先检查DPD,再检查DHL,最后检查其他类别
内容的提问来源于stack exchange,提问作者thn
相关产品推荐
相关产品推荐

