WooCommerce is the most popular eCommerce platform on the internet – it powers over 28% off all online stores. Today, we are going to cover how to implement WooCommerce infinite scrolling with the free Ajax Load More plugin for WordPress.

🎉 Announcement: We just released the WooCommerce add-on for Ajax Load More that offers automatic integration into existing WooCommerce shop templates with zero configuration. View Add-on.

Before we begin, make sure you have both Ajax Load More and WooCommerce activated and products have been created so there is content ready for infinite scrolling 🙂

Note: The following guide and examples reference code from the official WooCommerce theme, Storefront.


**July 2019 Update**

Version 5.1 of Ajax Load More introduced built-in support for WooCommerce on pages, templates, and product archives using the woocommerce shortcode parameter.

Read more about the new integration in the Building a Shortcode section below.

Implementation

There are essentially four steps to WooCommerce infinite scrolling with Ajax Load More. None of the steps are overly difficult to complete, but you will be required to make modifications to core WooCommerce templates during the process.

The implementation steps are as follows:

  1. Create Child Theme
  2. Create Repeater Template
  3. Building a Shortcode
  4. WooCommerce Template

Alright, let’s go!


Create Child Theme

Since this tutorial will require modifying core theme template files the first step will be to create a child theme – this will allow us to make modifications and not worry about conflicts when theme updates are applied.

There are many resources available online that explain exactly how to create a child theme so I won’t go into any more detail on how to do that today.


Create Repeater Template

Next, you’ll want to create a unique WooCommerce Repeater Template for displaying your products,

Most WooCommerce-compatible themes use a variation of the default content-product.php template while iterating over products so you may be fine by simply copying the following template into your Ajax Load More Repeater Template.

<?php wc_get_template_part( 'content', 'product' ); ?>

Note: The template above was copied directly from WooCommerce core – I recommend inspecting your theme in the off chance it is using a modified version of the template.
/plugins/woocommerce/templates/content-product.php


Building a Shortcode

After creating the Repeater Template, you should build out a WooCommerce-specific shortcode. The WooCommerce shortcode instructs Ajax Load More on what content to include while infinite scrolling the products.

Shop Home/Landing Page

For a shop homepage or generic landing page, you simply need to set woocommerce=”true” in the core Ajax Load More shortcode.

With woocommerce set as true, Ajax Load More will automatically set product as the post_type parameter and products as the css_classes parameter for the Ajax query.

<?php
   echo do_shortcode('
    '); ?>

    Note: The majority of WordPress themes and plugins use .products as the container classname for styling WooCommerce product listings. 

    Product Archives

    On product archive pages, Ajax Load More will automatically detect the current term and taxonomy (e.g. product_tag or product_cat) and then behind the scenes it will set the corresponding taxonomy, taxonomy_terms, post_type and css_classes shortcode parameters.

    <?php
        echo do_shortcode('
      '); ?>

      Pro Tip: Use the css_classes shortcode parameter to add additional classes to the Ajax Load More container.

      Manual Implementation

      It’s not mandatory to use the built-in WooCommerce integration, you can always decide to manually build an Ajax Load More shortcode.

      <?php
      	if(is_archive()){
      		// Archive template.
      		$obj = get_queried_object();
      		$taxonomy = $obj->taxonomy; // Get taxonomy.
      		$taxonomy_term = $obj->slug; // Get term.
      		
      		echo do_shortcode('[
        '); ]
        } else { // Standard Page echo do_shortcode('[ajax_load_more post_type="product" css_classes="products"]'); } ?>
        PHP

        The code snippet above is an example of retrieving WooCommerce products on a taxonomy archive page.


        WooCommerce Template

        The final step is to clone and modify the archive-product.php template from /plugins/woocommerce/templates/ to the root of your current theme directory. This template used for displaying WooCommerce products so modifying this file directly will allow you to place the Ajax Load More shortcode into the correct location.

        Pro Tip: Your theme may already be using custom WooCommerce templates – in that case you should modify those templates and not core WooCommerce templates as referenced below.

        Once the template has been cloned, open the file in your code editor and select everything from the opening if(wc_get_loop_prop(‘total’)){ to the closing } bracket of the conditional statement. You will want to replace the selected contents, including the while() loop with the following Ajax Load More specific code.

        // archive-product.php
        if ( wc_get_loop_prop( 'total' ) ) {	
           echo do_shortcode('[ajax_load_more woocommerce="true" posts_per_page="6"]');			   
        }
        PHP

        Click here to view the complete archive-product.php template.

        With the template updated and steps 1 through 4 complete you should have a working WooCommerce infinite scroll – check out the following links to see our code implemented on a shop homepage and product archive.

        Wrapping Things Up

        It might seem like a lot of tasks to implement WooCommerce infinite scrolling, but keep in mind at the end of the day all you’re really doing is replacing the default WooCommerce loop with Ajax Load More.

        Got any WooCommerce specific questions or suggestions? Leave them in the comments and I’ll do my best to help you out!

        Comments

        28 thoughts on “Infinite Scroll WooCommerce Products with Ajax Load More”

        1. Avatar

          madison

          November 03, 2020 @ 4:21 am
          Reply

          Nevermind, I realized product attributes are treated as taxonomies in your shortcode, all good! thanks for the great plugin.

        2. Avatar

          Bruno

          June 03, 2020 @ 7:24 pm
          Reply

          hi Darren Cooney amazing Plug-in thanks!

          Im trying to implement the masonry option but im having the “Uncaught TypeError: Cannot read property ‘style’ of undefined” i read your FAQ but the repeater i’m using is what you put in the tutorial

          with this shortcode [ajax_load_more loading_style="infinite skype" woocommerce="true" posts_per_page="6" repeater="default"] every works like a charm

          but with this one [ajax_load_more loading_style="infinite skype" woocommerce="true" posts_per_page="6" repeater="default" transition="masonry" masonry_selector=".product" ]

          i have this error i put the .product in the masonry_selector because it the markupof the woocommerce template but i try the .grid-item also no luck! i I also added the css that you explain in the masonry example page. Try to find info everywhere about this error no luck!

          Thanks and hope you can help me!

          1. Avatar

            Darren Cooney

            June 04, 2020 @ 9:06 am
            Reply

            Hi Bruno,
            Thanks! This error usually means there an issue in the Repeater Template.
            https://connekthq.com/plugins/ajax-load-more/docs/faqs/#25

            Can you possibly share a link to the issue?

            1. Avatar

              Bruno

              June 04, 2020 @ 9:14 am
              Reply

              Thanks for the reply I already see that faq but im using the repeater temlate:
              wc_get_template_part( ‘content’, ‘product’ );

              link: https://shop.brunodasilva.pt/catalog/

              if i remove the transition=”masonry” masonry_selector=”.product” option of the shortcode works perfectly

              thanks again for your support

              1. Avatar

                Darren Cooney

                June 04, 2020 @ 9:35 am
                Reply

                Interesting. TBH I’ve never tried WooCommerce with masonry so I would have to test it.

                If you want, open a support ticket and i can follow up over email. Unless you’re fine without Masonry.
                https://connekthq.com/support/?product=Ajax%20Load%20More

                1. Avatar

                  Bruno

                  June 04, 2020 @ 9:43 am

                  I opened support ticket! thanks

        3. Avatar

          Satinder

          February 03, 2020 @ 8:54 am
          Reply

          Hi, I am trying your plugin with easy property listing plugin, it works wonderfully but have a small glitch, it doesn’t allow shortcode to run properly , like post_type=”property,land” sortby=”status” , here sortby=”status” doesn’t work means only the first part works but not second or third

          here is a sample of code

          [ajax_load_more listing  post_type="property,land" sortby="status" listing limit="30"  tools_top="on" status="sold" container_type="div" transition_container_classes="css-grid" posts_per_page="6"  button_label="Load More" button_loading_label="Wait, Data Loading !!!!!!!"]

          Any guidance shall be highly appreciated and 5 Stars

          1. Avatar

            Darren Cooney

            February 03, 2020 @ 11:59 am
            Reply

            Hi Satinder,
            `sortby` and `listing limit` are not valid shortcode parameters for Ajax Load More.

            To add a custom parameter you could use the following filter or the custom_args parameter.
            https://connekthq.com/plugins/ajax-load-more/docs/filter-hooks/#alm_query_args

            `[ajax_load_more custom_args="sortby:status"]`

            Let me know if this helps at all.

        4. Avatar

          Joao Sarmento

          October 09, 2019 @ 6:14 am
          Reply

          Hi,

          can this plugin be used to retrieve Products across a woocommerce multiste installation?

          example.com/UK
          example.com/France

          They will all have the same plugins, but Woocommerce will have different campaigns (using a crowdfunding plugin) in each sub folder.

          They will have different currencies (Pounds and Euro).

          Can the plugin be used to do a search on example.com and retrieve the campaign data from /uk and /france and show the results on example.com ?

          Please let em know.

          Cheers

          Joao

          1. Avatar

            Darren Cooney

            October 09, 2019 @ 10:36 am
            Reply

            Hi Joao,
            Unfortunately I’m not sure about this one.

        5. Avatar

          Matthew

          October 08, 2019 @ 5:03 am
          Reply

          Hi,
          I have got Ajax Load More 95% working I think. I am not sure if this is an compatibility issue with your plugin and Woo Side Cart Plugin but I cant get the “Add to Cart” Button to obtain the correct parameters so that it adds the item to the cart rather than open up the single product page.

          I have used the “create” repeater template (above) and the a href rel=”nofollow” comes back “/wp-admin/admin-ajax.php?id&post_id=9400&slug=scroll-test&canonical_url=https%3A%2F%2Fchromalytic.net.au%2Fscroll-test%2F&posts_per_page=15&page=0&offset=0&post_type=product&repeater=default&seo_start_page=1&preloaded=false&preloaded_amount=0&taxonomy=product_cat&taxonomy_terms=male-luer-integral-lock-ring&taxonomy_operator=IN&order=DESC&orderby=date&action=alm_get_posts&query_type=standard&add-to-cart=5317”
          instead of
          “/scroll-test/?add-to-cart=5317”

          I have created a scroll-test page so that you can see what happens and the differences in what I am wanting to achieve. The page has my original section using a default pagination shortcode/plugin that I want to eventually replace with your Ajax load more plugin (in the section below).

          https://chromalytic.net.au/scroll-test/

          Hopefully I have made sense – I have a feeling I just need to create an appropriate repeater template – but I am not great with php or understanding the woocommerce hooks / templates

          1. Avatar

            Darren Cooney

            October 08, 2019 @ 3:17 pm
            Reply

            Hey Matthew,
            This looks as though Woo Side Cart is not using the correct HTTP referral link to build it’s Add to Cart URLs. It’s using the URL in the Ajax reqeust.

            I think you might be best to open a ticket with them on this and let them know that Add to Cart URLs are not the correct URL when being loaded via admin-ajax.

            1. Avatar

              Matthew

              October 08, 2019 @ 9:57 pm
              Reply

              Hi Darren,

              Thanks for your reply. I will open a support ticket with them, but not sure it is related to Woo Side Cart Plugin.
              I have disable the WSC Plugin and the linking issues are still the same regarding the Product List from Top Section of the page to the bottom section under the Older Posts button (which is generated from your plugin.
              This time when I click “add to cart” button (same link a previous), it stays on the page and displays a “view cart” button underneath.
              The “add to cart” button that is under the Older Posts Section has the same link as previous and when clicked gets redirected to the Single Product Page

              I have a feeling it has something to do with the hook
              do_action( ‘woocommerce_after_shop_loop_item’ );
              which initiates/display the add to cart button. Maybe the template has been modified somehow but I would not know where/how to check. Or is there an alternative command I can try?

              1. Avatar

                Darren Cooney

                October 09, 2019 @ 12:01 pm
                Reply

                This may be an issue in your particular theme where the JS is not triggering.

                Seems to be working on my testing site.
                https://examples.connekthq.com/woocommerce/woocommerce-filtering/

        6. Avatar

          Nick

          August 19, 2019 @ 8:52 pm
          Reply

          Hi, I have implemented the Auto Scroll as directed and it worked. the only issue I have is that the format chnaged. What was 3 across in a grid is now 1 across in a list with the date added! Is there anything I need to add to the shortcode to retain the format?

          1. Avatar

            Darren Cooney

            August 20, 2019 @ 9:13 am
            Reply

            Hey Nick,
            I think you may have missed the section on creating your own the Repeater Template.
            https://connekthq.com/woocommerce-infinite-scrolling/#create-template

            Let me know if you have troubles.

        7. Avatar

          Ismail

          June 01, 2019 @ 3:29 am
          Reply

          Hi Darren,

          I have done the following steps to make it work for my WooCommerce store site with flatsome theme.
          1. copied block from content-product.php to default(repeater) template in uploads folder.
          2. cloned archive-product template from /plugins/woocommerce/templates/ to root folder of my child theme. file path in my case is /themes/flatsome-child/archive-product.php
          3. Nested following code block to if ( wc_get_loop_prop( ‘total’ ) )
          {ALM code bock(if/else) here} section in archive-product template:

          ALM Code Block Inserted:

          if(is_archive()){ // Product Archives

          $obj = get_queried_object();
          $taxonomy = $obj->taxonomy; // Get taxonomy
          $taxonomy_term = $obj->slug; // Get term
          echo do_shortcode(‘[ajax_load_more post_type="product" taxonomy="'. $taxonomy .'" taxonomy_terms="'. $taxonomy_term .'" taxonomy_operator="IN" css_classes="products" posts_per_page="6" transition="fade"]‘);

          } else { // Shop Landing Page

          echo do_shortcode(‘[ajax_load_more post_type="product" css_classes="products" posts_per_page="6" transition="fade"]‘);

          }

          Its not working. Can you please point out what i am doing wrong here.

          1. Avatar

            Ismail

            June 03, 2019 @ 2:59 am
            Reply

            Hi Darren,

            The issue is fixed by moving archive-product file from child theme root to woocommerce folder created under child theme root.
            But now the issue is that my theme layout is broken:
            1. sidebar is not showing on left side but below the products
            2. single product is showing instead of 4 in case of desktop and 2 in case of mobile
            Can you please help me fix this.
            And do you have a plan to integrate woocommerce feature in plugin options?

            Thanks.

            1. Avatar

              Darren Cooney

              June 10, 2019 @ 9:10 am
              Reply

              Hi Ismail,
              Oh, nice work. Glad to hear it’s sorted.

        8. Avatar

          John Negoita

          May 19, 2019 @ 1:56 am
          Reply

          hi Darren,

          I’m trying to implement ALM with masonry for my products in Woo.
          and I’m doing this in the archive-product.php

          echo do_shortcode(‘[ajax_load_more post_type="product" taxonomy="'. $taxonomy .'" taxonomy_terms="'. $taxonomy_term .'" taxonomy_operator="IN" css_classes="products" posts_per_page="6" transition="masonry" masonry_selector=".grid-item"]‘);

          But, I’m getting this JS error:

          Cannot read property ‘style’ of undefined at new ajaxloadmore (ajax-load-more.js:122)

          When debugging it seems that the code expects the element alm-btn-wrap to be inside the ajax-load-more-wrap element, but it’s actually outside

          What am I doing wrong?

          thanks,
          John

          1. Avatar

            Darren Cooney

            May 21, 2019 @ 8:17 am
            Reply

            Hey John,
            This error is usually related to an issue in the repeater template. If a template is closing an extra div, ALM can lose the positioning of the button.
            Can you share your template in a Gist or something?

        9. Avatar

          boombalaya

          May 03, 2019 @ 4:39 pm
          Reply

          Would it be possible to connect the shortcode with woocommerce’s attributes filter widget so users can sort by size / color?, I already tried adding the parameters in the shortcode and fetching the values from the URL via $GET[‘filter_size’] but I must be doing something wrong because no products are shown.

          1. Avatar

            boombalaya

            May 03, 2019 @ 5:18 pm
            Reply

            Nevermind, I realized product attributes are treated as taxonomies in your shortcode, all good! thanks for the great plugin.

            1. Avatar

              Darren Cooney

              May 04, 2019 @ 10:23 am
              Reply

              Yes, you need to pass the taxonomies into the shortcode. I hope to make this easier for everyone soon, but for now it’s sort of a manual process.
              Glad it’s working for you!

              1. Avatar

                boombalaya

                May 06, 2019 @ 1:37 pm
                Reply

                Thank you so much, yeah I got that working and I’m just missing one thing, I don’t know if it’s possible. Is there a way to also pass the product price range values? Thank you!

                1. Avatar

                  Darren Cooney

                  May 08, 2019 @ 11:49 am

                  Can you show me an example?

        10. Avatar

          Jeremy

          October 03, 2018 @ 9:11 pm
          Reply

          Would it be possible for you to make a video explaining these steps as you go along? I’m not a computer science major and I’m pretty much faking it until I make it with this stuff… It’s super cool in theory, but I honestly have no idea what I’m doing and videos are much more helpful than written instructions because I can follow along as you go. Thanks!

          1. Avatar

            Darren Cooney

            October 06, 2018 @ 12:12 pm
            Reply

            Hi Jeremy,
            My plan is to start creating more video content very soon.

        Leave a Reply

        Your email address will not be published. Required fields are marked *