-
-
Save bekarice/0143d1b423857b0c6885 to your computer and use it in GitHub Desktop.
| <?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; |
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..
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?
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!
I found this plugin that solved my problem: https://github.com/Craftpeak/woocommerce-prevent-repeat-purchases
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.
Hi after your latest update (the same day i raised above comment) i decided to try the new code.
And get this different error now
2020-02-26T08:52:17+00:00 CRITICAL Uncaught Error: Call to a member function is_type() on boolean in /home/xxxx/public_html/wp-content/themes/xxxx/functions.php:1015 Stack trace: #0 /home/xxxx/public_html/wp-includes/class-wp-hook.php(288): sv_purchase_disabled_message('') #1 /home/xxxx/public_html/wp-includes/class-wp-hook.php(312): WP_Hook->apply_filters(NULL, Array) #2 /home/xxxx/public_html/wp-includes/plugin.php(478): WP_Hook->do_action(Array) #3 /home/xxxx/public_html/wp-content/plugins/woocommerce/templates/content-single-product.php(60): do_action('woocommerce_sin...') #4 /home/xxxx/public_html/wp-includes/template.php(724): require('/home/xxxx/...') #5 /home/xxxx/public_html/wp-content/plugins/woocommerce/includes/wc-core-functions.php(195): load_template('/home/xxxx/...', false) #6 /home/xxxx/public_html/wp-content/plugins/woocommerce/templates/single-product.php(36): wc_get_template_part('content', 'single-product') #7 /home/xxxx/public_html/wp-includes/template-loader.php(98): inc in /home/xxxx/public_html/wp-content/themes/xxxx/functions.php on line 1015
May i know how to do it to prevent category or multiple products ?