My WooCommerce的store 在某些情况下提供100%的折扣代码.在这种情况下,我不想收集用户的地址.我需要在 checkout 时设置有条件的地址字段,只有当折扣后的总数超过0.

我已经创建了一个函数,将使地址字段不是必需的,如果打折后的购物车总数等于0,则隐藏.

add_filter( 'woocommerce_default_address_fields', 'customising_checkout_fields', 10000, 1 );
function customising_checkout_fields( $address_fields ) {
    $total = WC()->cart->cart_contents_total;
    
    if ( $total == 0 ) {
        $address_fields['address_1']['required'] = false;
        $address_fields['address_2']['required'] = false;
        $address_fields['company']['required'] = false;
        $address_fields['country']['required'] = false;
        $address_fields['city']['required'] = false;
        $address_fields['state']['required'] = false;
        $address_fields['postcode']['required'] = false; 
        
        $address_fields['address_1']['hidden'] = true;
        $address_fields['address_2']['hidden'] = true;
        $address_fields['company']['hidden'] = true;
        $address_fields['country']['hidden'] = true;
        $address_fields['city']['hidden'] = true;
        $address_fields['state']['hidden'] = true;
        $address_fields['postcode']['hidden'] = true; 
    }
    return $address_fields;
}

这个很好用.问题是,只有当用户使用购物车中已经应用的优惠券从购物车到 checkout 时,它才会加载.如果用户想要在 checkout 时添加优惠券,字段不会自动更新(只有价格是).相反的方向也是一样的-如果用户删除优惠券,价格不再是0,这些字段仍然隐藏,除非用户手动刷新页面.

如何编写一个函数来自动更新帐单详细信息窗格,就像WooCommerce目前更新购物车总数一样?

推荐答案

在您的例子中,因为这与服务器端的PHP函数相关,所以唯一的方法是完全重新加载WooCommerce checkout 页面,以获得所有刷新的 checkout 字段.

您可以使用以下函数来捕获 checkout 页面上的AJAX优惠券事件,该函数使用JavaScript/jQuery.每次客户try 申请优惠券或删除优惠券时,页面都将重新加载.如果需要,您可以在功能中调整两个超时.

代码:

add_action( 'woocommerce_checkout_init', 'autoreload_checkout_on_coupon_event' );
function autoreload_checkout_on_coupon_event() {
    // Set the correct timeout value (in milliseconds)
    $timout1 = 600; // when applying a coupon
    $timout2 = 1500; // when removing a coupon
 
    wc_enqueue_js( "$.ajaxSetup({
        beforeSend: function(j, s) {
            if(s.url === '/?wc-ajax=apply_coupon' || s.url === '/?wc-ajax=remove_coupon') {
                var time = s.url === '/?wc-ajax=apply_coupon' ? {$timout1} : {$timout2};
                setTimeout(function(){
                    location.reload();
                }, time);
            }
        }
    });");
}

代码放在活动子主题(或活动主题)的函数.php文件中.经过测试和工作.

Php相关问答推荐

仅显示特定WooCommerce产品类别的额外产品字段

未在moodle上运行的计划任务

在php中有没有办法比较两个包含相同枚举类型的枚举数组

LaravelEloquent 的地方条件父/子与第三模型多对多

根据WooCommerce购物车页面中的自定义 Select 添加费用

是否重新排序多维数组元素以将所有子数组中的子数组移动到元素列表的底部?

在个人资料页面上显示个人资料图像

在WooCommerce中以编程方式添加特定产品后,将价格设置为零

在 PHP 中将字符串分解为数组(字符串类似于 WP 短代码)

WooCommerce:如果购物车中已存在产品,则增加购物车商品数量

奇怪的 preg_match_all() 行为

如果 Select 的县不是store 所在的县,如何隐藏本地自提?

有没有办法获取触发流操作的页面的 URI?

PHP:如何将多列sql查询结果转换成数组

适当的时区处理 Laravel / Carbon

自定义错误页面不适用于 Apache 和 nginx 设置的 .htaccess

Symfony 6 中的入口点 (public/index.php) - 它是如何工作的?

在 DomPDF 和 Laravel 中使用内联 css

使用 --exclude-dir 选项从 PHP 执行 grep 时出现问题

复杂的mysql查询问题