https://wordpresslab.ru/e-commerce/huki-straniczy-...
Как вариант, вначале использовать хуки woocommerce_single_product_summary и woocommerce_after_shop_loop_item, и по условию, удалять события woocommerce_template_single_add_to_cart и woocommerce_template_loop_add_to_cart:
function test() {
global $product;
if($product->get_price() == 0 || $product->get_price() == '') {
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 99);
remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10);
}
}
add_action('woocommerce_single_product_summary', 'test', 99);
add_action('woocommerce_after_shop_loop_item', 'test', 99);