| 1 | <?php |
|---|
| 2 | function paginate_links( $args = '' ) { |
|---|
| 3 | global $wp_query, $wp_rewrite; |
|---|
| 4 | |
|---|
| 5 | $total = ( isset( $wp_query->max_num_pages ) ) ? $wp_query->max_num_pages : 1; |
|---|
| 6 | $current = ( get_query_var( 'paged' ) ) ? intval( get_query_var( 'paged' ) ) : 1; |
|---|
| 7 | $pagenum_link = html_entity_decode( get_pagenum_link() ); |
|---|
| 8 | $query_args = array(); |
|---|
| 9 | $url_parts = explode( '?', $pagenum_link ); |
|---|
| 10 | |
|---|
| 11 | if ( isset( $url_parts[1] ) ) { |
|---|
| 12 | wp_parse_str( $url_parts[1], $query_args ); |
|---|
| 13 | } |
|---|
| 14 | |
|---|
| 15 | $pagenum_link = remove_query_arg( array_keys( $query_args ), $pagenum_link ); |
|---|
| 16 | $pagenum_link = trailingslashit( $pagenum_link ) . '%_%'; |
|---|
| 17 | |
|---|
| 18 | $format = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : ''; |
|---|
| 19 | $format .= $wp_rewrite->using_permalinks() ? user_trailingslashit( $wp_rewrite->pagination_base . '/%#%', 'paged' ) : '?paged=%#%'; |
|---|
| 20 | |
|---|
| 21 | $defaults = array( |
|---|
| 22 | 'base' => $pagenum_link, // http://example.com/all_posts.php%_% : %_% is replaced by format (below) |
|---|
| 23 | 'format' => $format, // ?page=%#% : %#% is replaced by the page number |
|---|
| 24 | 'total' => $total, |
|---|
| 25 | 'current' => $current, |
|---|
| 26 | 'show_all' => false, |
|---|
| 27 | 'prev_next' => true, |
|---|
| 28 | 'prev_text' => __('« Previous'), |
|---|
| 29 | 'next_text' => __('Next »'), |
|---|
| 30 | 'end_size' => 1, |
|---|
| 31 | 'mid_size' => 2, |
|---|
| 32 | 'type' => 'plain', |
|---|
| 33 | 'add_args' => false, // array of query args to add |
|---|
| 34 | 'add_fragment' => '', |
|---|
| 35 | 'before_page_number' => '', |
|---|
| 36 | 'after_page_number' => '', |
|---|
| 37 | 'link_current' => false, |
|---|
| 38 | ); |
|---|
| 39 | |
|---|
| 40 | $args = wp_parse_args( $args, $defaults ); |
|---|
| 41 | |
|---|
| 42 | // Who knows what else people pass in $args |
|---|
| 43 | $total = (int) $args['total']; |
|---|
| 44 | if ( $total < 2 ) { |
|---|
| 45 | return; |
|---|
| 46 | } |
|---|
| 47 | $current = (int) $args['current']; |
|---|
| 48 | $end_size = (int) $args['end_size']; // Out of bounds? Make it the default. |
|---|
| 49 | if ( $end_size < 1 ) { |
|---|
| 50 | $end_size = 1; |
|---|
| 51 | } |
|---|
| 52 | $mid_size = (int) $args['mid_size']; |
|---|
| 53 | if ( $mid_size < 0 ) { |
|---|
| 54 | $mid_size = 2; |
|---|
| 55 | } |
|---|
| 56 | $add_args = is_array( $args['add_args'] ) ? $args['add_args'] : false; |
|---|
| 57 | $r = ''; |
|---|
| 58 | $page_links = array(); |
|---|
| 59 | $page_link_data = array(); |
|---|
| 60 | $dots = false; |
|---|
| 61 | $active = false; |
|---|
| 62 | |
|---|
| 63 | if ( $args['prev_next'] && $current && 1 < $current ) : |
|---|
| 64 | $link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] ); |
|---|
| 65 | $link = str_replace( '%#%', $current - 1, $link ); |
|---|
| 66 | if ( $add_args ) |
|---|
| 67 | $link = add_query_arg( $add_args, $link ); |
|---|
| 68 | $link .= $args['add_fragment']; |
|---|
| 69 | |
|---|
| 70 | /** |
|---|
| 71 | * Filter the paginated links for the given archive pages. |
|---|
| 72 | * |
|---|
| 73 | * @since 3.0.0 |
|---|
| 74 | * |
|---|
| 75 | * @param string $link The paginated link URL. |
|---|
| 76 | */ |
|---|
| 77 | $page_link_data[] = array( |
|---|
| 78 | 'type' => 'prev', |
|---|
| 79 | 'link' => esc_url( apply_filters( 'paginate_links', $link ) ), |
|---|
| 80 | 'text' => $prev_text, |
|---|
| 81 | 'active' => false, |
|---|
| 82 | ); |
|---|
| 83 | endif; |
|---|
| 84 | for ( $n = 1; $n <= $total; $n++ ) : |
|---|
| 85 | if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) : |
|---|
| 86 | $link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] ); |
|---|
| 87 | $link = str_replace( '%#%', $n, $link ); |
|---|
| 88 | if ( $add_args ) { |
|---|
| 89 | $link = add_query_arg( $add_args, $link ); |
|---|
| 90 | } |
|---|
| 91 | $link .= $args['add_fragment']; |
|---|
| 92 | |
|---|
| 93 | /** This filter is documented in wp-includes/general-template.php */ |
|---|
| 94 | $page_link_data[] = array( |
|---|
| 95 | 'type' => 'page', |
|---|
| 96 | 'link' => esc_url( apply_filters( 'paginate_links', $link ) ), |
|---|
| 97 | 'text' => number_format_i18n( $n ), |
|---|
| 98 | 'active' => ( $n == $current ), |
|---|
| 99 | ); |
|---|
| 100 | $dots = true; |
|---|
| 101 | elseif ( $dots && !$args['show_all'] ) : |
|---|
| 102 | $page_link_data[] = array( |
|---|
| 103 | 'type' => 'dots', |
|---|
| 104 | 'link' => null, |
|---|
| 105 | 'text' => __( '…' ), |
|---|
| 106 | 'active' => false, |
|---|
| 107 | ); |
|---|
| 108 | $dots = false; |
|---|
| 109 | endif; |
|---|
| 110 | endfor; |
|---|
| 111 | if ( $args['prev_next'] && $current && ( $current < $total || -1 == $total ) ) : |
|---|
| 112 | $link = str_replace( '%_%', $args['format'], $args['base'] ); |
|---|
| 113 | $link = str_replace( '%#%', $current + 1, $link ); |
|---|
| 114 | if ( $add_args ) |
|---|
| 115 | $link = add_query_arg( $add_args, $link ); |
|---|
| 116 | $link .= $args['add_fragment']; |
|---|
| 117 | |
|---|
| 118 | /** This filter is documented in wp-includes/general-template.php */ |
|---|
| 119 | $page_link_data[] = array( |
|---|
| 120 | 'type' => 'next', |
|---|
| 121 | 'link' => esc_url( apply_filters( 'paginate_links', $link ) ), |
|---|
| 122 | 'text' => $next_text, |
|---|
| 123 | 'active' => false, |
|---|
| 124 | ); |
|---|
| 125 | endif; |
|---|
| 126 | // If we just want the data without the HTML, then we don't need to |
|---|
| 127 | // process the HTML here. |
|---|
| 128 | if ( $args['type'] != 'array_raw' ) : |
|---|
| 129 | foreach ( $page_link_data as $page_link ) : |
|---|
| 130 | switch( $page_link['type'] ) { |
|---|
| 131 | case 'prev': |
|---|
| 132 | $page_links[] = '<a class="prev page-numbers" href="' . $page_link['text'] . '">' . $prev_text . '</a>'; |
|---|
| 133 | break; |
|---|
| 134 | case 'next': |
|---|
| 135 | $page_links[] = '<a class="next page-numbers" href="' . $page_link['text'] . '">' . $next_text . '</a>'; |
|---|
| 136 | break; |
|---|
| 137 | case 'dots': |
|---|
| 138 | $page_links[] = '<span class="page-numbers dots">' . $page_link['text'] . '</span>'; |
|---|
| 139 | break; |
|---|
| 140 | case 'page': |
|---|
| 141 | if ( ! $args['link_current'] && $page_link['active'] ) { |
|---|
| 142 | $page_links[] = "<span class='page-numbers current'>" . $args['before_page_number'] . $page_link['text'] . $args['after_page_number'] . "</span>"; |
|---|
| 143 | } else { |
|---|
| 144 | $page_links[] = "<a class='" . ($page_link['active'] ? 'current ' : null) . "page-numbers' href='" . $page_link['link'] . "'>" . $args['before_page_number'] . $page_link['text'] . $args['after_page_number'] . "</a>"; |
|---|
| 145 | } |
|---|
| 146 | break; |
|---|
| 147 | } |
|---|
| 148 | endforeach; |
|---|
| 149 | endif; |
|---|
| 150 | switch ( $args['type'] ) { |
|---|
| 151 | case 'array_raw' : |
|---|
| 152 | return $page_link_data; |
|---|
| 153 | |
|---|
| 154 | case 'array' : |
|---|
| 155 | return $page_links; |
|---|
| 156 | |
|---|
| 157 | case 'list' : |
|---|
| 158 | $r .= "<ul class='page-numbers'>\n\t<li>"; |
|---|
| 159 | $r .= join("</li>\n\t<li>", $page_links); |
|---|
| 160 | $r .= "</li>\n</ul>\n"; |
|---|
| 161 | break; |
|---|
| 162 | |
|---|
| 163 | default : |
|---|
| 164 | $r = join("\n", $page_links); |
|---|
| 165 | break; |
|---|
| 166 | } |
|---|
| 167 | return $r; |
|---|
| 168 | } |
|---|