Woocommerce shortcode pagination

I’m using Recent products shortcode, [recent_products per_page="4" columns="2"]
and would like to have pagination, because I’m displaying products on homepage – and currently only 4 products are being displayed. Is there a way to add pagination?

I have imported dummy data, so there are 45 products.

Related posts

Leave a Reply

4 comments

  1. You could consider a plugin: WP-PageNavi. In order to use it with Woocommerce, simply install and configure the plugin, then add the following code to your theme’s functions.php:

    remove_action('woocommerce_pagination', 'woocommerce_pagination', 10);
    function woocommerce_pagination() {
        wp_pagenavi();      
    }
    add_action( 'woocommerce_pagination', 'woocommerce_pagination', 10);
    

    Source: Mark van der Putten’s blog, comments ommitted.

    Also, you could ask this question on the dedicated StackExchange WordPress site.

  2. Referencing from this github gist https://gist.github.com/klihelp/7810337 Including the following code into your child-theme functions.php after installing this plugin: https://wordpress.org/plugins/prime-strategy-page-navi/

    <?php
    /**
     * This code shows pagination for WooCommerce shortcodes when it's embeded on single pages.
     * Include into functions.php.
     */
    if ( ! is_admin() ) {
    // ---------------------- FRONTPAGE -------------------
    if ( defined('WC_VERSION') ) {
    // ---------------------- WooCommerce active -------------------
    
        /**
         * Set Pagination for shortcodes custom loop on single-pages.
         * @uses $woocommerce_loop;
         */
        add_action( 'pre_get_posts', 'kli_wc_pre_get_posts_query' ); 
        function kli_wc_pre_get_posts_query( $query ) {
            global $woocommerce_loop;
    
            // Get paged from main query only
            // ! frontpage missing the post_type
            if ( is_main_query() && ( $query->query['post_type'] == 'product' ) || ! isset( $query->query['post_type'] ) ){
    
              if ( isset($query->query['paged']) ){
                $woocommerce_loop['paged'] = $query->query['paged'];
              }
            }
    
            if ( ! $query->is_post_type_archive || $query->query['post_type'] !== 'product' ){
                return;
            }
    
            $query->is_paged = true;
            $query->query['paged'] = $woocommerce_loop['paged'];
            $query->query_vars['paged'] = $woocommerce_loop['paged'];
        }
    
        /** Prepare Pagination data for shortcodes on pages
         * @uses $woocommerce_loop;
         */
        add_action( 'loop_end', 'kli_query_loop_end' ); 
        function kli_query_loop_end( $query ) {
    
            if ( ! $query->is_post_type_archive || $query->query['post_type'] !== 'product' ){
                return;
            }
    
            // Cache data for pagination
            global $woocommerce_loop;
            $woocommerce_loop['pagination']['paged'] = $woocommerce_loop['paged'];
            $woocommerce_loop['pagination']['found_posts'] = $query->found_posts;
            $woocommerce_loop['pagination']['max_num_pages'] = $query->max_num_pages;
            $woocommerce_loop['pagination']['post_count'] = $query->post_count;
            $woocommerce_loop['pagination']['current_post'] = $query->current_post;
        }
        /**
         * Pagination for shortcodes on single-pages 
         * @uses $woocommerce_loop;
         */
        add_action( 'woocommerce_after_template_part', 'kli_wc_shortcode_pagination' ); 
        function kli_wc_shortcode_pagination( $template_name ) {
            if ( ! ( $template_name === 'loop/loop-end.php' && is_page() ) ){
                return;
            }
            global $wp_query, $woocommerce_loop;
            if ( ! isset( $woocommerce_loop['pagination'] ) ){
                return;
            }
            $wp_query->query_vars['paged'] = $woocommerce_loop['pagination']['paged'];
            $wp_query->query['paged'] = $woocommerce_loop['pagination']['paged'];
            $wp_query->max_num_pages = $woocommerce_loop['pagination']['max_num_pages'];
            $wp_query->found_posts = $woocommerce_loop['pagination']['found_posts'];
            $wp_query->post_count = $woocommerce_loop['pagination']['post_count'];
            $wp_query->current_post = $woocommerce_loop['pagination']['current_post'];
    
            // Custom pagination function or default woocommerce_pagination()
            kli_woocommerce_pagination();
        }   
        /**
         * Custom pagination for WooCommerce instead the default woocommerce_pagination()
         * @uses plugin Prime Strategy Page Navi, but added is_singular() on #line16
         */
        remove_action('woocommerce_after_shop_loop', 'woocommerce_pagination', 10);
        add_action( 'woocommerce_after_shop_loop', 'kli_woocommerce_pagination', 10);
        function kli_woocommerce_pagination() {
            wp_pagenavi(); 
        }
    }// END WOOCOMMERCE
    }// END FRONTPAGE
    
  3. Use [recent_products limit="12" columns="4" paginate="true"]. This shortcode limit 12 means maximum 12 post on a page. more info woocommerce doc