У вас не верный подход в принципе. Вы смешиваете логику и представление, но это отдельная тема.
Вот это:
if ( '' === $product->get_price() || 0 == $product->get_price() )
Вообще можно заменить на
if (!$product->get_price())
И тогда необходимость в функции
product_price_free_zero_empty
отпадает.
В коде, который собирает html страницы пишете что-то вроде:
if (!$product->get_price()){
echo '<span class="woocommerce-Price-amount amount">By request</span>';
}
А под тегами, где нужна кнопка:
if (!$product->get_price()){
echo '<input type="button" value="Кнопка" /> ';
}