-
-
Save klihelp/7810337 to your computer and use it in GitHub Desktop.
<?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 |
Thanks danielgc, yawalcar.
Refreshed the code.
@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.
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.
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.
thanks this code works like a charm!
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!
@jlr7245 - I am using your code, but pagination is still not displaying. Any ideas?:-/ Thanks a lot!
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.
hello, i still dont understand please can someone write how i do this step by step ?
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!
It's awesome working!!! Thanks so much @klihelp. It saves my life.
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.
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?
Thanks klihelp and yawalkar, thank you very much
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;
I used "Shortcode Pagination for WooCommerce" plugin, and work's pretty well.
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.