How to disable fields that are pre-filled in WooCommerce checkout?

空扰寡人 提交于 2021-02-19 08:59:10

问题


I would like to prevent (make these fields readonly, for example) users from changing their billing information on the WooCommerce checkout form.

I'm currently using this code snippet:

add_filter('woocommerce_billing_fields', 'mycustom_woocommerce_billing_fields', 10, 1 );
function mycustom_woocommerce_billing_fields($fields)
{
   $fields['billing_first_name']['custom_attributes'] = array('readonly'=>'readonly');
   $fields['billing_last_name']['custom_attributes'] = array('readonly'=>'readonly');
   $fields['billing_email']['custom_attributes'] = array('readonly'=>'readonly');
   $fields['billing_phone']['custom_attributes'] = array('readonly'=>'readonly');
   return $fields;
}

But the problem is: If the user has not filled in any of these fields in the registration, he is unable to insert his data in the checkout form because these fields are not editable.

My question is: If the fields are not empty, how to make them readonly (or disabled)

Someone who can help me with this?


回答1:


The answer of 7uc1f3r certainly works getting the user data… But since WooCommerce 3, you can use WC_Checkout get_value() dedicated method as follow:

add_filter( 'woocommerce_billing_fields', 'filter_wc_billing_fields', 10, 1 );
function filter_wc_billing_fields( $fields ) {
    // On checkout and if user is logged in
    if ( is_checkout() && is_user_logged_in() ) {
        // Define your key fields below
        $keys_fields = ['billing_first_name', 'billing_last_name', 'billing_email', 'billing_phone'];

        // Loop through your specific defined fields
        foreach ( $keys_fields as $key ) {
            // Check that a value exist for the current field
            if( ( $value = WC()->checkout->get_value($key) ) && ! empty( $value ) ) {
                // Make it readonly if a value exist
                $fields[$key]['custom_attributes'] = ['readonly'=>'readonly'];
            }
        }
    }
    return $fields;
}

Code goes in functions.php file of your active child theme (or active theme). Tested and works.

If you want this code to be also active in My account > Addresses > edit…, you will just have to remove is_checkout() && from the first IF statement.




回答2:


I believe this is what you are looking for, comment with explanation added in code

function mycustom_woocommerce_billing_fields( $fields ) {   
    // Get current user
    $user = wp_get_current_user();

    // User id
    $user_id = $user->ID;

    // User id is found
    if ( $user_id > 0 ) { 
        // Fields
        $read_only_fields = array ( 'billing_first_name', 'billing_last_name', 'billing_email', 'billing_phone' );

        // Loop
        foreach ( $fields as $key => $field ) {     
            if( in_array( $key, $read_only_fields ) ) {
                // Get key value
                $key_value = get_user_meta($user_id, $key, true);

                if( strlen( $key_value ) > 0 ) {
                    $fields[$key]['custom_attributes'] = array(
                        'readonly'=>'readonly'
                    );
                }
            }
        }
    }

   return $fields;
}
add_filter('woocommerce_billing_fields', 'mycustom_woocommerce_billing_fields', 10, 1 );


来源:https://stackoverflow.com/questions/62351584/how-to-disable-fields-that-are-pre-filled-in-woocommerce-checkout

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!