get_id(); // Bail unless the ID is equal to our desired non-purchasable product if ( $non_purchasable !== $product_id ) { return $purchasable; } // return false if the customer has bought the product if ( wc_customer_bought_product( get_current_user()->user_email, get_current_user_id(), $product_id ) ) { $purchasable = false; } return $purchasable; } add_filter( 'woocommerce_variation_is_purchasable', 'sv_disable_repeat_purchase', 10, 2 ); add_filter( 'woocommerce_is_purchasable', 'sv_disable_repeat_purchase', 10, 2 ); /** * Shows a "purchase disabled" message to the customer */ function sv_purchase_disabled_message() { global $product; // get the current product to check if purchasing should be disabled // Enter the ID of the product that shouldn't be purchased again $no_repeats_id = 356; $no_repeats_product = wc_get_product( $no_repeats_id ); if ( $no_repeats_product->is_type( 'variation' ) ) { // Bail if we're not looking at the product page for the non-purchasable product if ( ! $no_repeats_product->get_parent_id() === $product->get_id() ) { return; } // Render the purchase restricted message if we are if ( wc_customer_bought_product( get_current_user()->user_email, get_current_user_id(), $no_repeats_id ) ) { sv_render_variation_non_purchasable_message( $product, $no_repeats_id ); } } elseif ( $no_repeats_id === $product->get_id() ) { if ( wc_customer_bought_product( get_current_user()->user_email, get_current_user_id(), $no_repeats_id ) ) { // Create your message for the customer here echo '
You\'ve already purchased this product! It can only be purchased once.
'; } } } add_action( 'woocommerce_single_product_summary', 'sv_purchase_disabled_message', 31 ); if ( ! function_exists( 'sv_render_variation_non_purchasable_message' ) ) : /** * 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; // edit your customer message here echo '
You\'ve already purchased this product! It can only be purchased once.
'; } } } // show / hide this message for the right variation with some jQuery magic 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(); "); } } endif;