You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce仅虚拟商品时移除结账页元素问题求助

问题原因分析

你的代码没生效的核心问题是钩子触发时机太晚:woocommerce_checkout_after_terms_and_conditions这个钩子是在结账页面的条款和条件区域渲染之后才触发的,这时候你要移除的那些action早就已经执行完毕了,所以remove_action根本起不到作用。

另外,你的代码里还有一个小语法错误:remove_action( 'woocommerce_checkout_terms_and_conditions', 'woocontracts_terms_fields', );最后多了个逗号,这会导致PHP报错,也是代码不生效的潜在原因。

解决方案

我们需要把条件判断和remove_action的逻辑移到更早的钩子上,比如template_redirect——这个钩子在WordPress加载页面模板之前触发,刚好能在结账页面的各种action执行前完成移除操作。

下面是修正后的完整代码:

add_action( 'template_redirect', 'bbloomer_simplify_checkout_virtualab' );
function bbloomer_simplify_checkout_virtualab() {
    // 仅在结账页面执行逻辑,排除结账完成后的端点页面
    if ( ! is_checkout() || is_wc_endpoint_url() ) return;

    $only_virtual = true;

    // 遍历购物车商品,检查是否存在非虚拟商品
    foreach( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( ! $cart_item['data']->is_virtual() ) {
            $only_virtual = false;
            break; // 找到非虚拟商品就停止遍历,提升效率
        }
    }

    if( $only_virtual ) {
        // 移除指定的结账页面元素
        remove_action( 'woocommerce_checkout_terms_and_conditions', 'wc_checkout_privacy_policy_text', 20 );
        remove_action( 'woocommerce_checkout_terms_and_conditions', 'wc_terms_and_conditions_page_content', 30 );
        remove_action( 'woocommerce_checkout_terms_and_conditions', 'woocontracts_terms_fields' ); // 去掉多余的逗号,默认优先级10
        remove_action( 'woocommerce_before_checkout_form', 'woocommerce_checkout_coupon_form', 10 );
        remove_action( 'woocommerce_checkout_order_review', 'woocommerce_order_review', 10 );
        remove_action( 'woocommerce_checkout_after_terms_and_conditions', 'woocontracts_checkout_additional_checkboxes', 10 );
        remove_action( 'woocommerce_checkout_process', 'woocontracts_checkout_field_process', 10 );
    }
}
关键优化点说明
  1. 钩子选择:用template_redirect确保在结账页面的所有元素渲染前执行移除操作,保证remove_action生效。
  2. 页面判断:添加is_checkout() && !is_wc_endpoint_url()的判断,避免在结账完成后的订单详情等端点页面误执行逻辑。
  3. 遍历优化:找到非虚拟商品后立即break退出循环,减少不必要的计算。
  4. 语法修正:移除了remove_action里多余的逗号,避免PHP语法错误。
测试注意事项
  • 把代码添加到你的WordPress主题的functions.php文件,或者一个自定义功能插件中(不建议直接修改WooCommerce核心文件)。
  • 测试前清空浏览器缓存和网站缓存,确保代码生效。
  • 分别测试两种场景:购物车仅含虚拟商品、购物车包含实体商品,验证元素是否正确显示/隐藏。

内容的提问来源于stack exchange,提问作者musa baltaci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:13:10