php - 基于免费送货有条件地隐藏 Woocommerce 结帐自定义字段

标签 php jquery wordpress woocommerce checkout

在Woocommerce中,我尝试在选择“免费送货”时隐藏一个自定义的字段(根据订单量自动选择)。

我在想我找到了一个带有下面代码的解决方案,但是当我在新的(隐身)浏览器窗口上加载页面时,该字段存在,如果刷新它,该字段将再次隐藏。

// Hide address field, when Free Shipping mode is selected
add_filter('woocommerce_checkout_fields', 'xa_remove_billing_checkout_fields');

function xa_remove_billing_checkout_fields($fields) {
    $shipping_method ='free_shipping:5'; // Set the desired shipping method to hide the checkout field(s).
    global $woocommerce;
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = $chosen_methods[0];

    if ($chosen_shipping == $shipping_method) {
        unset($fields['billing']['billing_field_432']); // Add/change filed name to be hide
    }
    return $fields;
}

任何帮助表示赞赏。

最佳答案

由于它是现场事件,因此您需要使用 javascript/jQuery 使其工作。您的“billing_field_432”必须不是必需的,因为当字段被隐藏并尝试提交订单时,将针对此自定义结帐字段抛出错误通知消息。

基于 'free_shipping:5' 运输方式显示/隐藏该字段的代码:

// Conditional Show hide checkout fields based on chosen shipping methods
add_action( 'wp_footer', 'conditionally_hidding_billing_custom_field' );
function conditionally_hidding_billing_custom_field(){
    // Only on checkout page
    if( ! is_checkout() ) return;

    // HERE your shipping methods rate ID "Free shipping"
    $free_shipping = 'free_shipping:5';
    ?>
    <script>
        jQuery(function($){
            // Choosen shipping method selectors slug
            var sm  = 'input[name^="shipping_method"]',
                smc = sm + ':checked',
                cbf = '#billing_field_432_field',
                ihc = 'input[name="hidden_check"]';

            // Function that shows or hide imput select fields
            function showHide( selector = '', action = 'show' ){
                if( action == 'show' )
                    $(selector).show( 200, function(){
                        $(this).addClass("validate-required");
                        $(ihc).val('1'); // Set hidden field for checkout process
                    });
                else
                    $(selector).hide( 200, function(){
                        $(this).removeClass("validate-required");
                        $(ihc).val(''); // Set hidden field for checkout process
                    });
                $(selector).removeClass("woocommerce-validated");
                $(selector).removeClass("woocommerce-invalid woocommerce-invalid-required-field");
            }

            // Initialising: Hide if choosen shipping method is "Free Shipping" method
            if( $(smc).val() == '<?php echo $free_shipping; ?>' )
                showHide( cbf, 'hide' );
            else
                $(ihc).val('1'); // Set hidden field for checkout process

            // Live event (When shipping method is changed): Show or Hide based on "Free Shipping" method
            $( 'form.checkout' ).on( 'change', sm, function() {
                if( $(smc).val() == '<?php echo $free_shipping; ?>' )
                    showHide( cbf, 'hide' );
                else
                    showHide( cbf );
            });
        });
    </script>
    <?php
}
'billing_field_432' 时添加自定义结帐隐藏输入字段以启用“必填”字段选项检查过程的代码不隐藏:
// Add a hidden input field for "required" option check process
add_filter('woocommerce_checkout_fields', 'add_custom_hidden_input_field' );
function add_custom_hidden_input_field( $fields ) {

    echo '<input type="hidden" id="hidden_check" name="hidden_check" value="">';

    return $fields;
}

// Check custom checkout field "billing_field_432" when not hidden
add_action('woocommerce_checkout_process', 'check_custom_field_checkout_process');
function check_custom_field_checkout_process() {
    // Check if set, if its not set add an error.
    if ( isset( $_POST['hidden_check'] ) && $_POST['hidden_check'] && empty( $_POST['billing_field_432'] ) )
        wc_add_notice( __( 'Please enter something in "billing field 432".' ), 'error' ); // SET your custom error notice
}

此代码位于您的事件子主题(或主题)的 function.php 文件中。测试和工作。

它基于:Conditionally hide a Checkout field in WooCommerce based on chosen shipping

由于您使用的是最低订购量为“50”和hiding other shipping methods when "free shipping" is available 的免费送货方式.你应该改用这个:
// Unset checkout field based on cart amount for free shipping
add_filter('woocommerce_checkout_fields', 'remove_checkout_billing_field_432', 999 );
function remove_checkout_billing_field_432( $fields ) {
    if ( WC()->cart->cart_contents_total >= 50 ) {
        unset($fields['billing']['billing_field_432']); // Unset field
    }
    return $fields;
}

此代码位于您的事件子主题(或主题)的 function.php 文件中。测试和工作。

关于php - 基于免费送货有条件地隐藏 Woocommerce 结帐自定义字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49266306/

相关文章:

javascript/firebug 跳过代码行

mysql - 我应该拆分WP数据库吗? (基于多个数据库运行的单个WP)?

html - 当前菜单项不会在主页(第一)部分激活,直到移动

php - 对JSON编码数据(如过滤器)执行sql查询

php - 如何从用户上传到我的服务器的视频中获取缩略图?

php - 缓存mysql查询结果?

javascript - 基于 keyup 事件使用 jquery 在 CSS 样式插入之间切换

javascript - jqGrid工具栏上的小数搜索

php - MySQL:如果字段为空,则赋值

wordpress - 你能在 htaccess 文件中有条件吗