In older versions of WooCommerce free prices used to display as “FREE!” and products with empty prices were not publishable/purchasable. Now they’ve changed this around, but I still believe “FREE” looks much better than “$0.00”. It’s much more enticing, isn’t it?
Well, here’s how you restore the old WooCommerce functionality – as usual it’s as simple as using a PHP filter provided by WooCommerce and overriding the default behavior.

PHP Snippet: Display “FREE” if WooCommerce Product Price is Zero or Empty – WooCommerce Single Product Page
/** * @snippet Display FREE if Price Zero or Empty - WooCommerce Single Product * @how-to Get CustomizeWoo.com FREE * @author Rodolfo Melogli * @testedwith WooCommerce 3.8 * @donate $9 https://businessbloomer.com/bloomer-armada/ */ add_filter( 'woocommerce_get_price_html', 'bbloomer_price_free_zero_empty', 9999, 2 ); function bbloomer_price_free_zero_empty( $price, $product ){ if ( '' === $product->get_price() || 0 == $product->get_price() ) { $price = '<span class="woocommerce-Price-amount amount">FREE</span>'; } return $price; }