Woocommerce: No pedir Dirección para Productos Virtuales

Hoy me pidieron agregar un producto variable (PDF descargable) a una tienda.
Haciendo pruebas vi que cuando se paga, se pide la dirección de facturación y opcionalmente la de envío.
Esos datos no son necesarios, ya que no habrá envío, y produce fricción.
Entonces decidí eliminar esos campos del checkout cuando solo se están comprando productos virtuales.

Lo primero es marcar el producto como Virtual y opcionalmente Descargable

 

El hook que se utilizará para este fin es

woocommerce_checkout_fields

Y para saber si solo tenemos productos virtuales usaremos la función:

$woocommerce->cart->needs_shipping()

Esta función nos regresa si se tiene un producto que necesita envío, es decir no son virtules.

Entonces si nos regresa false, procedemos a eliminar los campos:

        unset($fields['billing']['billing_company']);
        unset($fields['billing']['billing_address_1']);
        unset($fields['billing']['billing_address_2']);
        unset($fields['billing']['billing_city']);
        unset($fields['billing']['billing_postcode']);
        unset($fields['billing']['billing_country']);
        unset($fields['billing']['billing_state']);

 

Aquí está el código completo:

<?php
/*
 * Plugin Name:       woo-simplify-downloads
 * Plugin URI:        https://urano.dev/plugins
 * Description:       Handle the basics with this plugin.
 * Version:           0.1.dev
 * Requires at least: 6.0
 * Requires PHP:      8.1
 * Author:            Urano Dev
 * Author URI:        https://urano.dev/software-para-ecommerce/
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Update URI:        https://urano.dev/plugins
 * Text Domain:       my-basics-plugin
 * Domain Path:       /languages
  */

add_filter('woocommerce_checkout_fields','udev_custom_checkout_fields');

function udev_custom_checkout_fields( $fields ) {
    global $woocommerce;
    $only_virtual = !$woocommerce->cart->needs_shipping(); //function to check if there are any physical product in the cart
    if($only_virtual) {
        unset($fields['billing']['billing_company']);
        unset($fields['billing']['billing_address_1']);
        unset($fields['billing']['billing_address_2']);
        unset($fields['billing']['billing_city']);
        unset($fields['billing']['billing_postcode']);
        unset($fields['billing']['billing_country']);
        unset($fields['billing']['billing_state']);
    }
    return $fields;
}