I have created a shipping rule with certain products so that such products have free shipping, but for example when I delete the product in the checkout cart from the mini cart, the shipping cost is not updated until I click on the Checkout button.
Is there a way to update the shipping rates using js when the product is removed from the mini cart?
Hello @diego93crhefdd
To update shipping rates when products are removed from the mini cart in the checkout page via JavaScript in Magento 2, you can utilize the Knockout.js framework that Magento 2 heavily relies on for frontend interactions. Here's a high-level approach to achieve this:
Determine the JavaScript event that is triggered when a product is removed from the mini cart. This event will be used to trigger the update of shipping rates.
JavaScript (assuming jQuery is also used for AJAX):
require([ 'jquery', 'Magento_Checkout/js/action/get-totals' ], function ($, getTotalsAction) { $(document).on('click', '.remove-product-button', function () { // Trigger AJAX to update shipping rates $.ajax({ url: '/checkout/cart/updatePost', method: 'POST', dataType: 'json', data: { 'item_id': $(this).data('item-id'), 'form_key': window.FORM_KEY, 'qty': 0 // Assuming the quantity is set to 0 for removal }, success: function (response) { // Update shipping rates getTotalsAction([]); }, error: function (xhr, status, error) { console.error(xhr.responseText); } }); }); });
PHP (Controller to handle AJAX request):
<?php namespace Vendor\Module\Controller\Cart; use Magento\Framework\App\Action\Context; class UpdatePost extends \Magento\Checkout\Controller\Cart { public function __construct( Context $context, \Magento\Framework\App\Request\Http $request ) { parent::__construct($context); $this->request = $request; } public function execute() { $itemId = (int)$this->getRequest()->getParam('item_id'); $qty = $this->getRequest()->getParam('qty'); try { $this->cart->getQuote()->getItemById($itemId)->delete(); $this->cart->save(); $this->_eventManager->dispatch('checkout_cart_update_item_complete', ['item' => $item]); $this->messageManager->addSuccess(__('You removed the item from your shopping cart.')); } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addException($e, __('We can\'t update the item right now.')); $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e); } catch (\Exception $e) { $this->messageManager->addException($e, __('We can\'t update the item right now.')); $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e); } return $this->_redirect('checkout/cart'); } }
Hope it helps !
If you find our reply helpful, please give us kudos.
A Leading Magento Development Agency That Delivers Powerful Results, Innovation, and Secure Digital Transformation.
WebDesk Solution Support Team
Get a Free Quote | | Adobe Commerce Partner | Hire Us | Call Us 877.536.3789
Thank You,
WebDesk Solution Support Team
Get a Free Quote | Email | Adobe Commerce Partner | Hire Us | Call Us 877.536.3789
Location: 150 King St. W. Toronto, ON M5H 1J9