Want to make the phone field optional at WooCommerce checkout? The fastest way is to add a small snippet to your functions.php file and the phone field instantly becomes optional with no paid plugin required. But there are actually several ways to do this depending on your setup, and I’ll walk you through all of them.

In this guide I cover:

  • Making it optional via theme settings (no code, Storefront only)
  • Completely hiding the phone field from Checkout and My Account
  • Making it required only for specific countries (advanced)
  • Using the WooCommerce Block Checkout toggle (new method)
  • Using a plugin if you don’t want to touch code at all

Pick the method that fits your situation.

Before You Start: Getting Ready

Before doing any code modifications, it’s always a good idea to take a full backup of your site and make sure that you have FTP access or access to cPanel, Plesk, or another control panel with access to a file manager.

If you wonder what is the best way to add code snippets to your site, always use your child theme’s functions.php or the free Code Snippets plugin. Never edit the parent theme directly, you’ll lose all changes on the next theme update.

Are you using Classic Checkout or Block Checkout?

WooCommerce introduced its Block-based checkout starting in WooCommerce 8.x. If your site was set up recently, you might be using this newer version. The Classic Checkout (shortcode-based) is still widely used too.

How to check: Go to your checkout page in the WordPress editor. If you see a block labeled “Checkout” in the block editor, you’re on Block Checkout. If your checkout page has [woocommerce_checkout] shortcode, you’re on Classic Checkout.

The code snippets in methods 1–3 work for Classic Checkout. For Block Checkout, see Method 4.

Which Method Should You Use?

Your situationBest method
Using Storefront theme, want the simplest changeMethod 1 (Customizer)
Want to completely remove the phone fieldMethod 2 (Remove snippet)
Just make it optional, keep it visibleMethod 2 (Optional snippet)
Phone required only for specific countriesMethod 3 (Country-based snippet)
Using WooCommerce Block CheckoutMethod 4 (Block settings)
No code at all, Classic CheckoutMethod 5 (Plugin)

Method 1: Make the Phone Field Optional in Theme Settings

Term Management Tools Plugin

Many WooCommerce-oriented themes have a specific set of options that allow you to customize the fields at the checkout page. Storefront, created by Automattic (the same team behind WooCommerce and WordPress itself), lets you decide which fields you want to make mandatory and which ones not via the Customizer.

So, if you use Storefront, or a similar theme that allows for it, simply go to Appearance > Customize and then select the WooCommerce tab. Go to Checkout, and from the dropdown under “Phone Field” select “Optional”.

And that’s it. Now all your customers will have the option to fill in the phone field only if they want to.

One important limitation with this method: Making the phone optional in the theme settings in Customizer has one drawback, the phone field is still visible (and required) in the “Addresses” tab in “My Account”. So, if your customer needs to change something in their address, they will not be able to save unless they actually fill in the phone field. To fix this consistently across both Checkout and My Account, use Method 2 instead.

Method 2: Completely Hide Phone Field from Both “Checkout” and “My Account” Pages

In order to hide the phone field entirely from both “My Account” and “Checkout” pages, add the following snippet to your child theme’s functions.php or via the Code Snippets plugin:

// Remove billing phone (and set email field class to wide)
add_filter( 'woocommerce_billing_fields', 'remove_billing_phone_field', 20, 1 );
function remove_billing_phone_field($fields) {
    $fields ['billing_phone']['required'] = false; // To be sure "NOT required"

    $fields['billing_email']['class'] = array('form-row-wide'); // Make the field wide

    unset( $fields ['billing_phone'] ); // Remove billing phone field
    return $fields;
}

// Remove shipping phone (optional)
add_filter( 'woocommerce_shipping_fields', 'remove_shipping_phone_field', 20, 1 );
function remove_shipping_phone_field($fields) {
    $fields ['shipping_phone']['required'] = false; // To be sure "NOT required"

    unset( $fields ['shipping_phone'] ); // Remove shipping phone field
    return $fields;
}

The two filters added will remove the phone field from both “Billing” and “Shipping” address sections, and newly registered customers will not be asked to fill in the phone information in the Checkout page.

The extra line that sets billing_email to form-row-wide is intentional without the phone field sitting next to it, the email field looks awkward at half-width. This makes your checkout layout look clean and intentional.

Method 3: Make Phone Field Optional Based on Shipping Country

Here’s a more elaborate scenario: let’s say your e-store has some shipping partners in your country and a few more countries. The shipping partner picks up the product from you and delivers it to your customer. However, they require a phone number so that they can contact the customer about the date and hour of delivery.

In this case, it would be very helpful to make the phone field mandatory for the countries where the shipping company requires it and optional for every other country. Here is a snippet that will allow you to do just that:

function defined_countries_for_phone_field(){
    return array( 'UK', 'BE', 'GE', 'IT', 'ES' );
}

// Remove "(optional)" from non required "Billing phone" field
add_filter( 'woocommerce_form_field' , 'remove_checkout_optional_fields_label', 10, 4 );
function remove_checkout_optional_fields_label( $field, $key, $args, $value ) {

    // Get the defined countries codes
    $countries = defined_countries_for_phone_field();

    // Get Customer shipping country
    $shipping_country = WC()->customer->get_shipping_country();

    // Only on checkout page and My account > Edit address for billing phone field
    if( 'billing_phone' === $key && ( ( is_wc_endpoint_url( 'edit-address' )
    && ! in_array($shipping_country, $countries) ) || is_checkout() ) ) {
        $optional = '&nbsp;<span class="optional">(' . esc_html__( 'optional', 'woocommerce' ) . ')</span>';
        $field = str_replace( $optional, '', $field );
    }
    return $field;
}

// Make the billing phone field optional (by default)
add_filter( 'woocommerce_billing_fields', 'filter_billing_phone_field', 10, 1 );
function filter_billing_phone_field( $fields ) {

    // Get the defined countries codes
    $countries = defined_countries_for_phone_field();

    // Get Customer shipping country
    $shipping_country = WC()->customer->get_shipping_country();

    // Only on checkout page and My account > Edit address
    if ( ( is_wc_endpoint_url( 'edit-address' )
    && ! in_array($shipping_country, $countries) ) || is_checkout() )
        $fields['billing_phone']['required'] = false;

    return $fields;
}

// Real time shipping country selection actions
add_action( 'woocommerce_after_order_notes', 'custom_checkout_scripts_and_fields', 10, 1 );
function custom_checkout_scripts_and_fields( $checkout ) {
    $required = esc_attr__( 'required', 'woocommerce' );

    // Get the defined countries codes
    $countries = defined_countries_for_phone_field();

    // Hidden field for the phone number validation
    echo '<input type="hidden" name="billing_phone_check" id="billing_phone_check" value="0">';
    $countries_str = "'".implode( "', '", $countries )."'"; // Formatting countries for jQuery
    ?>
    <script type="text/javascript">
        (function($){
            var required = '<abbr class="required" title="<?php echo $required; ?>">*</abbr>',
                countries = [<?php echo $countries_str; ?>],
                location = $('#shipping_country option:selected').val(),
                phoneCheck = 'input#billing_phone_check',
                phoneField = '#billing_phone_field';

            function actionRequire( actionToDo='yes', selector='' ){
                if ( actionToDo == 'yes' ) {
                    $(selector).addClass("validate-required");
                    $(selector+' label').append(required);
                } else {
                    $(selector).removeClass("validate-required");
                    $(selector+' label > .required').remove();
                }
                $(selector).removeClass("woocommerce-validated");
                $(selector).removeClass("woocommerce-invalid woocommerce-invalid-required-field");
            }

            // Default value Once DOM is loaded (with a 300 ms delay)
            setTimeout( function(){
                actionRequire( 'no', phoneField );
                if( $.inArray( location, countries ) >= 0  && $(phoneCheck).val() == '0' ){
                    actionRequire( 'yes',phoneField );
                    $(phoneCheck).val('1');
                }
            }, 300 );

            // Live value
            $( 'form.checkout' ).on( 'change', '#shipping_country', function(){
                var location = $('#shipping_country option:selected').val();
                if ( $.inArray( location, countries ) >= 0 && $(phoneCheck).val() == 0 ) {
                    actionRequire( 'yes', phoneField );
                    $(phoneCheck).val('1');
                } else if ( $(phoneCheck).val() == 1 ) {
                    actionRequire( 'no', phoneField );
                    $(phoneCheck).val('0');
                }
            });
       })(jQuery);
        </script>
    <?php
}

// Phone number validation, when the field is required
add_action('woocommerce_checkout_process', 'billing_phone_field_process');
function billing_phone_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['billing_phone'] && $_POST['billing_phone_check'] == '1' )
        wc_add_notice( __( 'Please enter a number phone.' ), 'error' );
}

With the code snippet above, if the customer wants the product shipped to one of the following countries: UK (‘UK’), Belgium (‘BE’), Germany (‘GE’), Italy (‘IT’), or Spain (‘ES’), the phone field will be mandatory. For every other shipping country, it will be optional.

How to customize the country list: Simply edit the array in the defined_countries_for_phone_field() function at the top. Replace or add country codes as needed. Use standard 2-letter ISO country codes (e.g. ‘DE’ for Germany, ‘FR’ for France, ‘US’ for United States).

Method 4: WooCommerce Block Checkout (No Code Needed)

If your checkout page uses the WooCommerce Checkout Block (introduced in WooCommerce 8.x), none of the PHP snippets above will work and you don’t need them to. WooCommerce built a phone field toggle directly into the block settings.

Here’s how to use it:

  1. Go to Pages > Checkout in your WordPress dashboard.
  2. Click Edit to open the page in the Block Editor.
  3. Click anywhere on the Checkout block to select it.
  4. In the right-hand Settings sidebar, look for the “Form Fields” or “Address Fields” section.
  5. You’ll see a “Phone” option with a dropdown. Change it from Required to Optional.
  6. Click Update to save the page.

Method 5: Using a Plugin (No Code, Works with Classic Checkout)

Checkout Field Editor for WooCommerce plugin

Not comfortable with code and not using Block Checkout? The Checkout Field Editor for WooCommerce plugin (free version available) lets you manage all checkout fields through a simple UI.

  1. Install and activate Checkout Field Editor (Checkout Manager) for WooCommerce from the WordPress plugin repository.
  2. In your dashboard, go to WooCommerce > Checkout Form.
  3. Find billing_phone (labeled “Billing Phone”).
  4. Click the Edit icon next to it.
  5. Uncheck the Required checkbox.
  6. Click Save Changes.

Done. This is ideal if you’re managing a client’s store and want a repeatable, no-code solution or if you plan to customize several other checkout fields at the same time.

Frequently Asked Questions

Will making the phone field optional affect my existing orders?

No. It only affects the frontend checkout form going forward. Existing orders and their stored data are completely untouched.

Can I make the phone field optional only for logged-in users?

Yes add a conditional check using is_user_logged_in() inside the snippet from Method.

Does this work with WooCommerce Subscriptions?

Yes. The code snippet approach works fine with WooCommerce Subscriptions. The phone field change applies at the billing fields level, which subscriptions also use.

Will this break anything else on my store?

No. Making a field optional or removing it is a very safe, low-impact change. It doesn’t affect payment processing, shipping calculations, or any other WooCommerce functionality.

What if I use CartFlows or FunnelKit for checkout?

These plugins manage their own field settings. Check inside the plugin’s form editor for phone field options, the WooCommerce filter-based snippets may not apply to custom checkout pages built with these tools.

Can I make phone optional only for digital products?

Yes, check whether the cart contains only virtual/downloadable products and conditionally set required to false. This is a common request for stores selling both physical and digital goods. Reach out to us if you need this implemented.