skip to Main Content

I’m building a theme with Slate and I have been researching how to prevent the default function of going to the cart page after you click add to cart on a product page.

All the answers I have gotten thus far have lead to dead ends. I also tried to load Cart.js onto the theme and it didn’t let me because there’s some liquid code mixed in with the initialize script.

Really looking for help to prevent a theme built with Slate from automatically going to the cart page once you click add to cart. Thanks!

2

Answers


  1. Chosen as BEST ANSWER

    Found a solution using Ajaxify cart (https://help.shopify.com/themes/customization/products/add-to-cart/stay-on-product-page-when-items-added-to-cart)

    To get this to work with Slate, you need to follow the instructions and make a few changes once they are all followed. Here's what I did.

    I had to take all the jQuery in the script tags and place it in a new file under scripts > vendor > vendor.js

    /**
     * Module to ajaxify all add to cart forms on the page.
     *
     * Copyright (c) 2015 Caroline Schnapp (11heavens.com)
     * Dual licensed under the MIT and GPL licenses:
     * http://www.opensource.org/licenses/mit-license.php
     * http://www.gnu.org/licenses/gpl.html
     *
     */
    Shopify.AjaxifyCart = (function($) {
    
      // Some configuration options.
      // I have separated what you will never need to change from what
      // you might change.
    
      var _config = {
    
        // What you might want to change
        addToCartBtnLabel:             'Add to cart',
        addedToCartBtnLabel:           'Thank you!',
        addingToCartBtnLabel:          'Adding...',
        soldOutBtnLabel:               'Sold Out',
        howLongTillBtnReturnsToNormal: 1000, // in milliseconds.
        cartCountSelector:             '.cart-count, #cart-count a:first, #gocart p a, #cart .checkout em, .item-count',
        cartTotalSelector:             '#cart-price',
        // 'aboveForm' for top of add to cart form, 
        // 'belowForm' for below the add to cart form, and 
        // 'nextButton' for next to add to cart button.
        feedbackPosition:              'nextButton',
    
        // What you will never need to change
        addToCartBtnSelector:          '[type="submit"]',
        addToCartFormSelector:         'form[action="/cart/add"]',
        shopifyAjaxAddURL:             '/cart/add.js',
        shopifyAjaxCartURL:            '/cart.js'
      };
    
      // We need some feedback when adding an item to the cart.
      // Here it is.  
      var _showFeedback = function(success, html, $addToCartForm) {
        $('.ajaxified-cart-feedback').remove();
        var feedback = '<p class="ajaxified-cart-feedback ' + success + '">' + html + '</p>';
        switch (_config.feedbackPosition) {
          case 'aboveForm':
            $addToCartForm.before(feedback);
            break;
          case 'belowForm':
            $addToCartForm.after(feedback);
            break;
          case 'nextButton':
          default:
            $addToCartForm.find(_config.addToCartBtnSelector).after(feedback);
            break;   
        }
        // If you use animate.css
        // $('.ajaxified-cart-feedback').addClass('animated bounceInDown');
        $('.ajaxified-cart-feedback').slideDown();
      };
      var _setText = function($button, label) {
        if ($button.children().length) {
          $button.children().each(function() {
            if ($.trim($(this).text()) !== '') {
              $(this).text(label);
            }
          });
        }
        else {
          $button.val(label).text(label);
        }
      };
      var _init = function() {   
        $(document).ready(function() { 
          $(_config.addToCartFormSelector).submit(function(e) {
            e.preventDefault();
            var $addToCartForm = $(this);
            var $addToCartBtn = $addToCartForm.find(_config.addToCartBtnSelector);
            _setText($addToCartBtn, _config.addingToCartBtnLabel);
            $addToCartBtn.addClass('disabled').prop('disabled', true);
            // Add to cart.
            $.ajax({
              url: _config.shopifyAjaxAddURL,
              dataType: 'json',
              type: 'post',
              data: $addToCartForm.serialize(),
              success: function(itemData) {
                // Re-enable add to cart button.
                $addToCartBtn.addClass('inverted');
                _setText($addToCartBtn, _config.addedToCartBtnLabel);
                _showFeedback('success','<i class="fa fa-check"></i> Added to cart! <a href="/cart">View cart</a> or <a href="/collections/all">continue shopping</a>.',$addToCartForm);
                window.setTimeout(function(){
                  $addToCartBtn.prop('disabled', false).removeClass('disabled').removeClass('inverted');
                  _setText($addToCartBtn,_config.addToCartBtnLabel);
                }, _config.howLongTillBtnReturnsToNormal);
                // Update cart count and show cart link.
                $.getJSON(_config.shopifyAjaxCartURL, function(cart) {
                  if (_config.cartCountSelector && $(_config.cartCountSelector).size()) {
                    var value = $(_config.cartCountSelector).html() || '0';
                    $(_config.cartCountSelector).html(value.replace(/[0-9]+/,cart.item_count)).removeClass('hidden-count');
                  }
                  if (_config.cartTotalSelector && $(_config.cartTotalSelector).size()) {
                    if (typeof Currency !== 'undefined' && typeof Currency.moneyFormats !== 'undefined') {
                      var newCurrency = '';
                      if ($('[name="currencies"]').size()) {
                        newCurrency = $('[name="currencies"]').val();
                      }
                      else if ($('#currencies span.selected').size()) {
                        newCurrency = $('#currencies span.selected').attr('data-currency');
                      }
                      if (newCurrency) {
                        $(_config.cartTotalSelector).html('<span class=money>' + Shopify.formatMoney(Currency.convert(cart.total_price, "{{ shop.currency }}", newCurrency), Currency.money_format[newCurrency]) + '</span>');
                      } 
                      else {
                        $(_config.cartTotalSelector).html(Shopify.formatMoney(cart.total_price, "{{ shop.money_format | remove: "'" | remove: '"' }}"));
                      }
                    }
                    else {
                      $(_config.cartTotalSelector).html(Shopify.formatMoney(cart.total_price, "{{ shop.money_format | remove: "'" | remove: '"' }}"));
                    }
                  };
                });        
              }, 
              error: function(XMLHttpRequest) {
                var response = eval('(' + XMLHttpRequest.responseText + ')');
                response = response.description;
                if (response.slice(0,4) === 'All ') {
                  _showFeedback('error', response.replace('All 1 ', 'All '), $addToCartForm);
                  $addToCartBtn.prop('disabled', false);
                  _setText($addToCartBtn, _config.soldOutBtnLabel);
                  $addToCartBtn.prop('disabled',true);
                }
                else {
                  _showFeedback('error', '<i class="fa fa-warning"></i> ' + response, $addToCartForm);
                  $addToCartBtn.prop('disabled', false).removeClass('disabled');
                  _setText($addToCartBtn, _config.addToCartBtnLabel);
                }
              }
            });   
            return false;    
          });
        });
      };
      return {
        init: function(params) {
            // Configuration
            params = params || {};
            // Merging with defaults.
            $.extend(_config, params);
            // Action
            $(function() {
              _init();
            });
        },    
        getConfig: function() {
          return _config;
        }
      }  
    })(jQuery);
    
    Shopify.AjaxifyCart.init();
    

    Next I made sure that this file was being called to the main vendor.js file using this code in scripts > vendor.js

    /*!
     * ajaxify-cart.js
     */
    // =require vendor/ajaxify-cart.js
    

    Last thing I had to do was edit out the liquid markup that was in the ajaxify-cart.js file. Since it is a .js file the liquid markup was making it malfunction. Here's the lines where I replaced liquid markup:

    if (newCurrency) {
                        $(_config.cartTotalSelector).html('<span class=money>' + Shopify.formatMoney(Currency.convert(cart.total_price, "CAD", newCurrency), Currency.money_format[newCurrency]) + '</span>');
                      }
                      else {
                        $(_config.cartTotalSelector).html(Shopify.formatMoney(cart.total_price));
                      }
                    }
                    else {
                      $(_config.cartTotalSelector).html(Shopify.formatMoney(cart.total_price));
                    }
    

    It's a bit hacky but so far it is working with my slate theme.

    I'm open to suggestions for improvement. Thanks.


  2. The redirect is probably based on a form submission, so you just need to use jQuery’s preventDefault method when the form is submitted.

    $('form[action^="/cart/add"]').on('submit', function(evt) {
      evt.preventDefault();
    
      //add custom cart code here
    });
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search