Again, a somewhat delayed response... but in faireness I only got round to actually attempting to fix this today.
In the unlikely event that someone on this silent list needs it, the snippet you need looks something like this. Maybe not exactly, but something. This does 99% I think.
/**
 * Disables repeat purchase for products / variations
 *
 * @param bool $purchasable true if product can be purchased
 * @param \WC_Product $product the WooCommerce product
 * @return bool $purchasable the updated is_purchasable check
 *
https://memberfix.rocks/woocommerce-buy-product-once/Â */
function sv_disable_repeat_purchase( $purchasable, $product ) {
   // Don’t run on parents of variations,
  // function will already check variations separately
    if ( $product->is_type( 'variable' ) ) {
  return $purchasable;
  }
 Â
  // Get the ID for the current product (passed in)
  $product_id = $product->get_id();
 Â
    // Return false if the customer has bought the product,
  // unless the product is ID 2118
  if ( $product_id != 2118 && wc_customer_bought_product( wp_get_current_user()->user_email, get_current_user_id(), $product_id ) ) {
    $purchasable = false;
  }
 Â
  // Double-check for variations: if parent is not purchasable, then variation is not
  if ( $purchasable && $product->is_type('variation') ) {
  $parent = wc_get_product( $product->get_parent_id() );
  $purchasable = $parent->is_purchasable();
  }
 Â
 Â
  return $purchasable;
}
add_filter( 'woocommerce_is_purchasable', 'sv_disable_repeat_purchase', 10, 2 );
/**
 * Shows a "purchase disabled" message to the customer
 */
function sv_purchase_disabled_message() {
  // Get the current product to see if it has been purchased
  global $product;
 Â
  // If the product has been purchased, display a message to the customer
  if ( wc_customer_bought_product( wp_get_current_user()->user_email, get_current_user_id(), $product->get_id() ) ) {
    echo '<div class="woocommerce"><div class="woocommerce-info wc-nonpurchasable-message">You\'ve already signed up to this event! <br />If a family member, friend or colleague wants to sign up, get them to do it on their own device.</div></div>';
  }
}
add_action( 'woocommerce_single_product_summary', 'sv_purchase_disabled_message', 31 );
/**
 * Generates a "purchase disabled" message to the customer for specific variations
 *
 * @param \WC_Product $product the WooCommerce product
 * @param int $no_repeats_id the id of the non-purchasable product
 */
function sv_render_variation_non_purchasable_message( $product, $no_repeats_id ) {
  // Double-check we're looking at a variable product
  if ( $product->is_type( 'variable' ) && $product->has_child() ) {
    $variation_purchasable = true;
   Â
    foreach ( $product->get_available_variations() as $variation ) {
      // Only show this message for non-purchasable variations matching our ID
      if ( $no_repeats_id === $variation['variation_id'] ) {
        $variation_purchasable = false;
        echo '<div class="woocommerce"><div class="woocommerce-info wc-nonpurchasable-message js-variation-' . sanitize_html_class( $variation['variation_id'] ) . '">You\'ve already signed up to this event! <br />If a family member, friend or colleague wants to sign up, get them to do it on their own device.</div></div>';
      }
    }
  }
 Â
    if (!$variation_purchasable) {
    wc_enqueue_js("
  jQuery('.variations_form')
  .on( 'woocommerce_variation_select_change', function( event ) {
  jQuery('.wc-nonpurchasable-message').hide();
  })
  .on( 'found_variation', function( event, variation ) {
  jQuery('.wc-nonpurchasable-message').hide();
  if ( ! variation.is_purchasable ) {
  jQuery( '.wc-nonpurchasable-message.js-variation-' + variation.variation_id ).show();
  }
  })
  .find( '.variations select' ).change();
  ");
  }
}