Created
December 18, 2015 10:55
-
-
Save kostasdizas/c9a017a89c757a223f83 to your computer and use it in GitHub Desktop.
A quick and dirty fork of Wordpress' paginate_links function, modified to output HTML code compliant with the Bootstrap Pagination component.
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 | |
/** | |
* A quick and dirty fork of Wordpress' paginate_links function, modified to output HTML code | |
* compliant with the Bootstrap Pagination component. | |
* | |
* @global WP_Query $wp_query | |
* @global WP_Rewrite $wp_rewrite | |
* | |
* @param string|array $args { | |
* Optional. Array or string of arguments for generating paginated links for archives. | |
* | |
* @type string $base Base of the paginated url. Default empty. | |
* @type string $format Format for the pagination structure. Default empty. | |
* @type int $total The total amount of pages. Default is the value WP_Query's | |
* `max_num_pages` or 1. | |
* @type int $current The current page number. Default is 'paged' query var or 1. | |
* @type bool $show_all Whether to show all pages. Default false. | |
* @type int $end_size How many numbers on either the start and the end list edges. | |
* Default 1. | |
* @type int $mid_size How many numbers to either side of the current pages. Default 2. | |
* @type bool $prev_next Whether to include the previous and next links in the list. Default true. | |
* @type bool $prev_text The previous page text. Default '« Previous'. | |
* @type bool $next_text The next page text. Default '« Previous'. | |
* | |
* @type array $add_args An array of query args to add. Default false. | |
* @type string $add_fragment A string to append to each link. Default empty. | |
* @type string $before_page_number A string to appear before the page number. Default empty. | |
* @type string $after_page_number A string to append after the page number. Default empty. | |
* } | |
* @return string String of page links or array of page links. | |
*/ | |
function bootstrap_paginate_links( $args = '' ) { | |
global $wp_query, $wp_rewrite; | |
// Setting up default values based on the current URL. | |
$pagenum_link = html_entity_decode( get_pagenum_link() ); | |
$url_parts = explode( '?', $pagenum_link ); | |
// Get max pages and current page out of the current query, if available. | |
$total = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1; | |
$current = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1; | |
// Append the format placeholder to the base URL. | |
$pagenum_link = trailingslashit( $url_parts[0] ) . '%_%'; | |
// URL base depends on permalink settings. | |
$format = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : ''; | |
$format .= $wp_rewrite->using_permalinks() ? user_trailingslashit( $wp_rewrite->pagination_base . '/%#%', 'paged' ) : '?paged=%#%'; | |
$defaults = array( | |
'base' => $pagenum_link, // http://example.com/all_posts.php%_% : %_% is replaced by format (below) | |
'format' => $format, // ?page=%#% : %#% is replaced by the page number | |
'total' => $total, | |
'current' => $current, | |
'show_all' => false, | |
'prev_next' => true, | |
'prev_text' => __('« Previous'), | |
'next_text' => __('Next »'), | |
'end_size' => 1, | |
'mid_size' => 2, | |
'type' => 'plain', | |
'add_args' => array(), // array of query args to add | |
'add_fragment' => '', | |
'before_page_number' => '', | |
'after_page_number' => '' | |
); | |
$args = wp_parse_args( $args, $defaults ); | |
if ( ! is_array( $args['add_args'] ) ) { | |
$args['add_args'] = array(); | |
} | |
// Merge additional query vars found in the original URL into 'add_args' array. | |
if ( isset( $url_parts[1] ) ) { | |
// Find the format argument. | |
$format = explode( '?', str_replace( '%_%', $args['format'], $args['base'] ) ); | |
$format_query = isset( $format[1] ) ? $format[1] : ''; | |
wp_parse_str( $format_query, $format_args ); | |
// Find the query args of the requested URL. | |
wp_parse_str( $url_parts[1], $url_query_args ); | |
// Remove the format argument from the array of query arguments, to avoid overwriting custom format. | |
foreach ( $format_args as $format_arg => $format_arg_value ) { | |
unset( $url_query_args[ $format_arg ] ); | |
} | |
$args['add_args'] = array_merge( $args['add_args'], urlencode_deep( $url_query_args ) ); | |
} | |
// Who knows what else people pass in $args | |
$total = (int) $args['total']; | |
if ( $total < 2 ) { | |
return; | |
} | |
$current = (int) $args['current']; | |
$end_size = (int) $args['end_size']; // Out of bounds? Make it the default. | |
if ( $end_size < 1 ) { | |
$end_size = 1; | |
} | |
$mid_size = (int) $args['mid_size']; | |
if ( $mid_size < 0 ) { | |
$mid_size = 2; | |
} | |
$add_args = $args['add_args']; | |
$r = ''; | |
$page_links = array(); | |
$dots = false; | |
if ( $args['prev_next'] && $current && 1 < $current ) : | |
$link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] ); | |
$link = str_replace( '%#%', $current - 1, $link ); | |
if ( $add_args ) | |
$link = add_query_arg( $add_args, $link ); | |
$link .= $args['add_fragment']; | |
/** | |
* Filter the paginated links for the given archive pages. | |
* | |
* @since 3.0.0 | |
* | |
* @param string $link The paginated link URL. | |
*/ | |
$page_links[] = '<li><a href="' . esc_url( apply_filters( 'paginate_links', $link ) ) . '">' . $args['prev_text'] . '</a></li>'; | |
endif; | |
for ( $n = 1; $n <= $total; $n++ ) : | |
if ( $n == $current ) : | |
$page_links[] = '<li class="active"><a>' . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . "</a></li>"; | |
$dots = true; | |
else : | |
if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) : | |
$link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] ); | |
$link = str_replace( '%#%', $n, $link ); | |
if ( $add_args ) | |
$link = add_query_arg( $add_args, $link ); | |
$link .= $args['add_fragment']; | |
/** This filter is documented in wp-includes/general-template.php */ | |
$page_links[] = "<li><a href='" . esc_url( apply_filters( 'paginate_links', $link ) ) . "'>" . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . "</a></li>"; | |
$dots = true; | |
elseif ( $dots && ! $args['show_all'] ) : | |
$page_links[] = '<span class="dots">' . __( '…' ) . '</span>'; | |
$dots = false; | |
endif; | |
endif; | |
endfor; | |
if ( $args['prev_next'] && $current && ( $current < $total || -1 == $total ) ) : | |
$link = str_replace( '%_%', $args['format'], $args['base'] ); | |
$link = str_replace( '%#%', $current + 1, $link ); | |
if ( $add_args ) | |
$link = add_query_arg( $add_args, $link ); | |
$link .= $args['add_fragment']; | |
/** This filter is documented in wp-includes/general-template.php */ | |
$page_links[] = '<li><a href="' . esc_url( apply_filters( 'paginate_links', $link ) ) . '">' . $args['next_text'] . '</a></li>'; | |
endif; | |
$r .= '<ul class="pagination">' . "\n\t"; | |
$r .= join( "\n\t", $page_links ); | |
$r .= "\n" . '</ul>' . "\n"; | |
return $r; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Do you know how this could be modified for Bootstrap 4?
https://v4-alpha.getbootstrap.com/components/pagination/