//Убираем способы оплаты , если хоть один товар без цены .
add_filter('woocommerce_cart_needs_payment', 'need_p',30);

function need_p($bool){
  return ($bool && !has_goods_with_zero_price_in_cart());
}

function has_goods_with_zero_price_in_cart(){
  foreach (WC()->cart->cart_contents as $product){
    if(0 == $product["data"]->price){
      return true;
    }
  }
  return false;
}