131 
Display “FREE” if WooCommerce Product Price is zero or empty
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
/**
* @snippet Display FREE if Price Zero or Empty - WooCommerce Single Product
* @how-to Get tutoraspire.com FREE
* @author Tutor Aspire
* @testedwith WooCommerce 5
* @donate $9 https://tutoraspire.com
*/
add_filter( 'woocommerce_get_price_html', 'tutoraspire_price_free_zero', 9999, 2 );
function tutoraspire_price_free_zero( $price, $product ) {
if ( $product->is_type( 'variable' ) ) {
$prices = $product->get_variation_prices( true );
$min_price = current( $prices['price'] );
if ( 0 == $min_price ) {
$max_price = end( $prices['price'] );
$min_reg_price = current( $prices['regular_price'] );
$max_reg_price = end( $prices['regular_price'] );
if ( $min_price !== $max_price ) {
$price = wc_format_price_range( 'FREE', $max_price );
$price .= $product->get_price_suffix();
} elseif ( $product->is_on_sale() && $min_reg_price === $max_reg_price ) {
$price = wc_format_sale_price( wc_price( $max_reg_price ), 'FREE' );
$price .= $product->get_price_suffix();
} else {
$price = 'FREE';
}
}
} elseif ( 0 == $product->get_price() ) {
$price = 'FREE';
}
return $price;
}