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

[php]woocommerce_checkout_fields[/php]

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

[php]
$woocommerce->cart->needs_shipping()
[/php]

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:

[php] 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']);
[/php]

 

Aquí está el código completo:

[php]
<?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;
}
[/php]