WooCommerce无可用配送方式时禁止访问结账页问题咨询
问题根因
原有代码未区分结账流程的不同页面状态:用户完成订单提交后,WooCommerce会加载结账页的order-received(订单接收)端点展示支付结果,此时购物车已经被清空,计算配送方式必然返回空值,触发重定向逻辑将用户从订单结果页跳转至空购物车页。
修复后可用代码
function prevent_checkout_access_no_shipping() { // 仅在结账页、非订单结果/支付页、购物车非空时执行校验 if ( function_exists( 'is_checkout' ) && is_checkout() && ! is_wc_endpoint_url( 'order-received' ) && ! is_wc_endpoint_url( 'order-pay' ) && ! WC()->cart->is_empty() ) { // 获取配送包裹并校验可用配送方式 $packages = WC()->cart->get_shipping_packages(); foreach( $packages as $key => $pkg ) { $calculate_shipping = WC()->shipping->calculate_shipping_for_package( $pkg ); if( empty( $calculate_shipping['rates'] ) ) { wp_redirect( esc_url( WC()->cart->get_cart_url() ) ); exit; } } } } // 使用WooCommerce推荐的重定向钩子替换原wp钩子,避免重定向报错 add_action( 'template_redirect', 'prevent_checkout_access_no_shipping' );
核心修改说明
- 新增
order-received、order-pay端点排除逻辑,跳过订单提交成功页、待支付订单支付页的配送校验,不影响正常下单后的流程 - 新增购物车非空判断,空购物车状态下不执行配送校验逻辑,避免多余判断
- 将触发钩子从
wp更换为template_redirect,这是WordPress/WooCommerce官方推荐的页面重定向专用钩子,执行时机更合理,不会出现因提前输出内容导致的重定向失效问题
内容的提问来源于stack exchange,提问作者Paul Johnson
相关产品推荐
相关产品推荐

