WordPress.org

Make WordPress Core

Ticket #29972: paging-new.php

File paging-new.php, 5.4 KB (added by dylanj, 7 years ago)

Full proposed version of paginate_links

Line 
1<?php
2function 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' => __('&laquo; Previous'),
29                'next_text' => __('Next &raquo;'),
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' => __( '&hellip;' ),
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}