WooCommerce单品页配送方式费用显示异常排查
解决WooCommerce单品页配送价格显示0.00的问题
问题根源
原代码存在几个导致价格无法正确获取的核心问题:
- 硬编码了Flat Rate类型的配置选项键,若你的配送方法并非Flat Rate,会直接取不到正确值;
- 直接调用
get_option读取配置不够可靠,WooCommerce本身提供了配送方法对象的内置方法来获取成本; - 未处理默认配送区域,未分配到特定区域的配送方法会被忽略;
- 获取产品配送类的逻辑冗余,可大幅简化。
修正后的代码
function display_shipping_methods() { global $product; if ( ! $product || ! $product->needs_shipping() ) { return ''; } $output = '<div class="shipping-methods">'; $output .= '<h5>Galimi pristatymo būdai:</h5>'; $output .= '<ul>'; // 直接获取产品配送类slug,简化逻辑 $product_shipping_class_slug = $product->get_shipping_class(); if ( $product_shipping_class_slug === '1' ) { $allowed_shipping_methods = array( 'Atsiėmimas vietoje' => '2-4 dienos', 'Omniva (Lithuania) Paštomatai' => '1-3 dienos', 'LP Express Paštomatai' => '1-3 dienos', ); // 获取所有配送区域,包括默认区域 $shipping_zones = WC_Shipping_Zones::get_zones(); $default_zone = WC_Shipping_Zones::get_zone_by('id', 0); $shipping_zones[] = $default_zone; foreach ( $shipping_zones as $shipping_zone ) { if ( empty( $shipping_zone['shipping_methods'] ) ) { continue; } foreach ( $shipping_zone['shipping_methods'] as $method ) { $method_title = $method->get_title(); if ( array_key_exists( $method_title, $allowed_shipping_methods ) ) { $method_class = sanitize_title( $method_title ); // 使用配送方法内置方法获取成本,兼容多种方法类型 $method_cost = $method->get_cost(); $delivery_time = $allowed_shipping_methods[$method_title]; $output .= '<li class="' . esc_attr( $method_class ) . '">'; $output .= '<span class="method-icon"></span>'; $output .= esc_html( $method_title ); $output .= ' - Price: ' . wc_price( $method_cost ); $output .= ' - Delivery Time: ' . esc_html( $delivery_time ); $output .= '</li>'; } } } } $output .= '</ul>'; $output .= '</div>'; return $output; } add_shortcode('shipping_methods', 'display_shipping_methods');
关键修改说明
- 简化配送类获取:用
$product->get_shipping_class()直接获取配送类slug,替代冗余的术语查询逻辑; - 兼容多种配送方法:使用
$method->get_cost()方法获取成本,不管是Flat Rate还是其他支持成本配置的配送方法,都能正确读取设置值; - 包含默认区域:加入默认配送区域的处理,确保未分配到特定区域的配送方法也能被检索到;
- 增强安全性:对HTML属性使用
esc_attr()转义,避免XSS风险; - 容错处理:增加对
$product对象的判断,避免无产品上下文时出现报错。
内容的提问来源于stack exchange,提问作者Radvis
相关产品推荐
相关产品推荐

