Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Disables Repeat Purchase for a particular WooCommerce product
<?php // only copy if needed!
/**
* Disables repeat purchase for the product
*
* @param bool $purchasable true if product can be purchased
* @param \WC_Product $product the WooCommerce product
* @return bool $purchasable the updated is_purchasable check
*/
function sv_disable_repeat_purchase( $purchasable, $product ) {
// Enter the ID of the product that shouldn't be purchased again
$non_purchasable = 356;
// Get the ID for the current product (passed in)
$product_id = $product->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 '<div class="woocommerce"><div class="woocommerce-info wc-nonpurchasable-message">You\'ve already purchased this product! It can only be purchased once.</div></div>';
}
}
}
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 '<div class="woocommerce"><div class="woocommerce-info wc-nonpurchasable-message js-variation-' . sanitize_html_class( $variation['variation_id'] ) . '">You\'ve already purchased this product! It can only be purchased once.</div></div>';
}
}
}
// 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;
@Gordonygcho

This comment has been minimized.

Copy link

Gordonygcho commented Jul 17, 2018

May i know how to do it to prevent category or multiple products ?

@mwiinga

This comment has been minimized.

Copy link

mwiinga commented Oct 14, 2018

Hello Beka,
Kindly asking on how we could make it possible for the "disable-product-repeat-purchase" only for a specified period of time, say 15 or 30 days, then the "Purchasing" is auto re-enabled for the user..

Thank you..

@s1-brad

This comment has been minimized.

Copy link

s1-brad commented Dec 21, 2018

Hi Beka, this works great for a single product but when i try to add an array it doesnt work adding
$non_purchasable = array('1234' , '5678');
My product image disappears and the product is still purchasable and no console errors?

@marqattack

This comment has been minimized.

Copy link

marqattack commented Feb 26, 2019

I would also like help in adding multiple product IDs. Has anyone had success? I've tried adding a new code snippet with a different ID but that crashes. Thanks for any ideas!

@marqattack

This comment has been minimized.

Copy link

marqattack commented Feb 26, 2019

I found this plugin that solved my problem: https://github.com/Craftpeak/woocommerce-prevent-repeat-purchases

@oempire

This comment has been minimized.

Copy link

oempire commented Feb 5, 2020

we get the following error showing in log now

[05-Feb-2020 15:48:50 UTC] id was called incorrectly. Product properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), wp, WP->main, WP->parse_request, do_action_ref_array('parse_request'), WP_Hook->do_action, WP_Hook->apply_filters, rest_api_loaded, WP_REST_Server->serve_request, WP_REST_Server->check_authentication, apply_filters('rest_authentication_errors'), WP_Hook->apply_filters, Automattic\WooCommerce\Blocks\RestApi::maybe_init_cart_session, WC_Cart->get_cart, WC_Cart_Session->get_cart_from_session, WC_Product->is_purchasable, apply_filters('woocommerce_is_purchasable'), WP_Hook->apply_filters, sv_disable_repeat_purchase, WC_Abstract_Legacy_Product->__get, wc_doing_it_wrong. This message was added in version 3.0.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.