Skip to content

Instantly share code, notes, and snippets.

@viniciusrtf
Last active February 1, 2024 12:32
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save viniciusrtf/b49403b5f87dcd7699c1 to your computer and use it in GitHub Desktop.
Save viniciusrtf/b49403b5f87dcd7699c1 to your computer and use it in GitHub Desktop.
WooCommerce Hook: Empty cart before adding a new product to cart WITHOUT throwing woocommerce_cart_is_empty
<?php
/**
* Hook: Empty cart before adding a new product to cart WITHOUT throwing woocommerce_cart_is_empty
*/
add_action ('woocommerce_add_to_cart', 'lenura_empty_cart_before_add', 0);
function lenura_empty_cart_before_add() {
global $woocommerce;
// Get 'product_id' and 'quantity' for the current woocommerce_add_to_cart operation
if (isset($_GET["add-to-cart"])) {
$prodId = (int)$_GET["add-to-cart"];
} else if (isset($_POST["add-to-cart"])) {
$prodId = (int)$_POST["add-to-cart"];
} else {
$prodId = null;
}
if (isset($_GET["quantity"])) {
$prodQty = (int)$_GET["quantity"] ;
} else if (isset($_POST["quantity"])) {
$prodQty = (int)$_POST["quantity"];
} else {
$prodQty = 1;
}
error_log('prodID: ' . $prodId); // FIXME
error_log('prodQty: ' . $prodQty); // FIXME
// If cart is empty
if ($woocommerce->cart->get_cart_contents_count() == 0) {
// Simply add the product (nothing to do here)
// If cart is NOT empty
} else {
$cartQty = $woocommerce->cart->get_cart_item_quantities();
$cartItems = $woocommerce->cart->cart_contents;
// Check if desired product is in cart already
if (array_key_exists($prodId,$cartQty)) {
// Then first adjust its quantity
foreach ($cartItems as $k => $v) {
if ($cartItems[$k]['product_id'] == $prodId) {
$woocommerce->cart->set_quantity($k,$prodQty);
}
}
// And only after that, set other products to zero quantity
foreach ($cartItems as $k => $v) {
if ($cartItems[$k]['product_id'] != $prodId) {
$woocommerce->cart->set_quantity($k,'0');
}
}
}
}
}
?>
@bartjones
Copy link

Thank you for this. I've been hunting for this for the last 2 hours. Works like a charm. I offer a bonus version of a product that is only available for 6 days. The timer plugin redirects to the normal price sales page after that, but that didn't guarantee that the cart would be empty of the reduced price version.

In other words this is perfect if you use evergreen countdown timers and woocommerce.

Thank you!!

@briangelhaus
Copy link

thanks dude!

@lutifyme
Copy link

Thank you! This is perfect. We use the /checkout/?add-to-cart=123 links for one-click checkout for our clients. However, if their order fails for whatever reason or they simply decide to abandon the cart only to get back to it later, they'll usually just click once again the /checkout/?add-to-cart=123 button to start all over effectively adding additional copy to their cart. Surprisingly, many of them never notice additional product in the cart until they receive the 'Order is complete' email. This is a perfect solution for us as it prevents this from happening. Thanks a bunch! We installed this as a simple plugin and it's working flawlessly.

@UgooAgbams
Copy link

UgooAgbams commented Sep 24, 2017

Please how do I install this plugin, or to add this code.
I downloaded the zip file, went to my plugin page and click add new, upload, install. But I got the following error...

Unpacking the package…

Installing the plugin…

The package could not be installed. No valid plugins were found.

Plugin install failed.

please help me out.

@chstappert
Copy link

Thanks a lot!

@viczx
Copy link

viczx commented Jun 2, 2019

great post!!! thanks

@nstyleinternational
Copy link

Excellent. Thanks alot

@Menasim1
Copy link

@viniciusrtf
Copy link
Author

This is an extremely old code snippet (10+ years old). Be careful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment