Last active
June 6, 2022 03:37
-
-
Save klihelp/7810337 to your computer and use it in GitHub Desktop.
WooCommerce shortcode pagination on pages
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 |
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.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.