WooCommerce如何获取所有可用配送服务选项(Packages)?
解决WooCommerce获取具体配送服务选项的问题
你报错是因为WC()->shipping()->get_shipping_packages()这个方法不存在,正确获取顾客结账时看到的具体配送选项(比如「First class」「Second class」这类),可以按以下方式实现:
// 绑定到合适的WooCommerce钩子,确保在系统初始化后执行 add_action('woocommerce_after_cart', 'fetch_shipping_service_options'); function fetch_shipping_service_options() { // 空购物车无法获取配送选项,直接返回 if (WC()->cart->is_empty()) { return; } // 正确获取绑定购物车的配送包(包含商品、地址等信息) $shipping_packages = WC()->cart->get_shipping_packages(); foreach ($shipping_packages as $package_key => $package) { // 手动计算当前配送包的配送费率(WooCommerce默认仅在结账/购物车页自动计算) WC()->shipping->calculate_shipping_for_package($package); // 提取计算后的具体配送选项 $shipping_rates = WC()->shipping->get_packages()[$package_key]['rates']; if (!empty($shipping_rates)) { echo '<h3>可用配送选项:</h3>'; foreach ($shipping_rates as $rate) { // 输出配送选项名称 echo '<p>' . esc_html($rate->label) . '</p>'; // 如需额外信息,可获取ID、价格等 // echo '<small>ID: ' . esc_html($rate->id) . ' | 价格: ' . wc_price($rate->cost) . '</small>'; } } else { echo '<p>暂无可用配送选项</p>'; } } }
核心说明:
- 配送包获取:用
WC()->cart->get_shipping_packages()而非WC()->shipping()的方法,因为配送包和购物车强绑定,包含商品、配送地址等必要计算条件。 - 触发计算:必须调用
calculate_shipping_for_package(),否则无法拿到具体的配送选项(自定义代码场景下不会自动触发计算)。 - 运行时机:务必在WooCommerce完全初始化、购物车有商品的场景执行,比如挂在
woocommerce_after_cart、woocommerce_checkout_init这类钩子上,避免过早调用导致无数据。
如果需要在后台等无真实购物车的场景获取,需手动模拟购物车商品和配送地址,否则无法得到符合实际场景的配送选项(配送选项依赖商品重量/尺寸、地址区域等条件)。
内容的提问来源于stack exchange,提问作者AJT
相关产品推荐
相关产品推荐

