-
-
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 |
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.
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!