Skip to content

Instantly share code, notes, and snippets.

@klihelp
Last active June 6, 2022 03:37
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save klihelp/7810337 to your computer and use it in GitHub Desktop.
Save klihelp/7810337 to your computer and use it in GitHub Desktop.
WooCommerce shortcode pagination on pages
<?php
/**
* Thanks for James Kemp / Iconic turning the idea into a plugin
* https://wordpress.org/plugins/shortcode-pagination-for-woocommerce
*
* 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() {
page_navi();
}
}// END WOOCOMMERCE
}// END FRONTPAGE
@yawalkar
Copy link

Change line no. 10 -

from -
if ( defined('WC_VERSION') {
to
if ( defined('WC_VERSION') ) {

And, replace the function "page_navi" with "woocommerce_pagination" on line no. 96

Works good!

@ahmeth
Copy link

ahmeth commented Mar 26, 2014

I though i found the solution for my problem but for whatever reason I cannot get the code above with all the mods to work.

I have added the code to function.php with modification outlined by yawalkar.

I get pagination when i work through shop loop but get no pagination when is use the following short code:

[product_category category="Large Displays" orderby="price" order="ASC" ]

I'm missing something.

Help!

@alexandreleroux
Copy link

Thanks... your code worked for me... salvation! This really should be included in stock WooCommerce...

@Slotty70
Copy link

hmm..i can`t get it work...made the edits of yawalkar..i use wc 2.2.6

@danielgc
Copy link

danielgc commented Nov 3, 2014

You are a lifesaver, klihelp your code along with yawalcar modifications are working great! this should be on the plugin already! best regards, and greetings from Mexico.

@klihelp
Copy link
Author

klihelp commented Jan 1, 2015

Thanks danielgc, yawalcar.
Refreshed the code.

Copy link

ghost commented Jan 17, 2015

@klihelp i added the exactly same code as above in my functions.php in theme folder on top, do i need make something more to get it work?

This is my shortcode where i want pagination: [product_category category="zubehoer" per_page="12" columns="4"]
Is this possible?

I also installed your plugin and added after in page.php, is this right`?

Please help me, im looking now a very long time ago to find a working solution.

Many Thanks

//Edit:
The problem is after adding your code above, pagination works (../page/2,../page/3,../page/4) but no pagination ist shown.

@hannahihayes
Copy link

Hello,

Thanks for this, it helped me to solve a problem I'd been having for a long time. However, I've noticed that the code does break the WooCommerce product search (instead of calling the archive-product.php template with no-products-found loop it instead gives me my 404 template).

Is there a solution for this?

Thanks.

@milinpatel87
Copy link

Hello klihelp,

I am facing same problem same as Bi0to facing. On home page pagination is showing but now working. It's redirecting on same url.

I tried same things with disable the plugin also.

Please help me out.

@baddot
Copy link

baddot commented Jun 14, 2015

thanks this code works like a charm!

@jlr7245
Copy link

jlr7245 commented Jun 25, 2015

Hi @klihelp !

I am trying to use your code & running into the same problem as @Bi0to, it seems like the code is working but the pagination isn't displaying. Is there another step I need to do before the pagination shows up?

thanks for the code!

EDIT: Never mind, the fork https://gist.github.com/alexandreleroux/ba8aba53441967638c87 of this worked perfectly for me. Thanks so much!

@starecml
Copy link

starecml commented Jul 6, 2015

@jlr7245 - I am using your code, but pagination is still not displaying. Any ideas?:-/ Thanks a lot!

@ShekharSS
Copy link

Thanks it just worked with me, for all those who are facing problem implementing the code, This might help you, you need to change "page_navi" with "woocommerce_pagination" on line no. 96 as told by yawalker, also don't copy the whole code in your theme function file, copy from line 10 to line 101 only and see the charm.

@T-bag382
Copy link

hello, i still dont understand please can someone write how i do this step by step ?

@frankthetank1234567
Copy link

Thanks a lot for this. Works perfect on pages!

Is there anyway to get this working on posts as well? Whenever I put the shortcode in one of my posts the pagination is not working. I really need to get it working soon. Any help would be greatly appreciated!

@duyngha
Copy link

duyngha commented Oct 14, 2015

It's awesome working!!! Thanks so much @klihelp. It saves my life.

@nadworks
Copy link

nadworks commented Jan 3, 2016

Ace code. Thanks!
Just wondering how I would be able to make the pagination optional. I.e. add a parameter into the shortcode for pagination=yes / pagination=no.
Sometimes the paginations are too much for a page that feat more than one list of products shortcode and subsequently multiple pagination rows.

@kubik101
Copy link

kubik101 commented Sep 9, 2016

Hi.
I am using:

  • WooCommerce Version 2.6.4
  • WordPress Version 4.6.1

All I have done is inserted the above code into my functions.php file and inserted the following shortcode into my page
[sale_products per_page="3" columns="3"]

This has enabled paging to work by visiting the page with /page/2/
But no pagination navigation is showing.

How do I get the pagination navigation to show?

@Nilesh5060
Copy link

Thanks klihelp and yawalkar, thank you very much

@elpuas
Copy link

elpuas commented Feb 25, 2017

Hi if i have a custom shortcut ( i use it for sort products by tag) is possible to added to your code after line 56 for example:

$woocommerce_loop['pagination']['my_shortcode'] = $query->my_shortcode;

@alticenterprise
Copy link

I used "Shortcode Pagination for WooCommerce" plugin, and work's pretty well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment