php – How to display paging with shortcodes in woocommerce, such as [Product_Category]

Question:

I'm using the shortcode [Product_Category] to display the products in the store for the ease of combining categories, I can display for example only the products that belong to the ERGOMETRY and PROFESSIONAL and NEW categories at the same time (if you want to know how to do this, ask me).

But the problem is that this shortcode has no option to display pagination, that is, if I set it to display only 12 products per page and I have more than 12 products, the other products will simply not be shown.

After a lot of searching I found a SOLUTION that worked to solve this and I will post as an answer because many people may be suffering from it.

Answer:

I would like to share this solution with you, the solution was given by [klihelp on github]: https://gist.github.com/klihelp/7810337 What worked for me was to put the following code in my theme's funcions.php file -child:

/**
* This code shows pagination for WooCommerce shortcodes when it's embeded on single pages.
* Include into functions.php.
*/
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() {
    woocommerce_pagination(); 
}
}// END WOOCOMMERCE
Scroll to Top