pagination-helper.php
5.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<?php
namespace Yoast\WP\SEO\Helpers;
use Yoast\WP\SEO\Wrappers\WP_Query_Wrapper;
use Yoast\WP\SEO\Wrappers\WP_Rewrite_Wrapper;
/**
* A helper object for pagination.
*
* Used for the canonical URL and the rel "next" and "prev" meta tags.
*/
class Pagination_Helper {
/**
* Holds the WP rewrite wrapper instance.
*
* @var WP_Rewrite_Wrapper WP_Rewrite wrapper.
*/
protected $wp_rewrite_wrapper;
/**
* Holds the WP query wrapper instance.
*
* @var WP_Query_Wrapper WP_Query wrapper.
*/
protected $wp_query_wrapper;
/**
* Pagination_Helper constructor.
*
* @param WP_Rewrite_Wrapper $wp_rewrite_wrapper The rewrite wrapper.
* @param WP_Query_Wrapper $wp_query_wrapper The query wrapper.
*/
public function __construct(
WP_Rewrite_Wrapper $wp_rewrite_wrapper,
WP_Query_Wrapper $wp_query_wrapper
) {
$this->wp_rewrite_wrapper = $wp_rewrite_wrapper;
$this->wp_query_wrapper = $wp_query_wrapper;
}
/**
* Checks whether adjacent rel links are disabled.
*
* @return bool Whether adjacent rel links are disabled or not.
*/
public function is_rel_adjacent_disabled() {
/**
* Filter: 'wpseo_disable_adjacent_rel_links' - Allows disabling of Yoast adjacent links if this is being handled by other code.
*
* @api bool $links_generated Indicates if other code has handled adjacent links.
*/
return \apply_filters( 'wpseo_disable_adjacent_rel_links', false );
}
/**
* Builds a paginated URL.
*
* @param string $url The un-paginated URL of the current archive.
* @param string $page The page number to add on to $url for the $link tag.
* @param bool $add_pagination_base Optional. Whether to add the pagination base (`page`) to the url.
* @param string $pagination_query_name Optional. The name of the query argument that holds the current page.
*
* @return string The paginated URL.
*/
public function get_paginated_url( $url, $page, $add_pagination_base = true, $pagination_query_name = 'page' ) {
$wp_rewrite = $this->wp_rewrite_wrapper->get();
$key_query_loop = $this->get_key_query_loop();
if ( $key_query_loop ) {
$pagination_query_name = $key_query_loop;
}
if ( $wp_rewrite->using_permalinks() && ! $key_query_loop ) {
$url_parts = \wp_parse_url( $url );
$has_url_params = \array_key_exists( 'query', $url_parts );
if ( $has_url_params ) {
// We need to first remove the query params, before potentially adding the pagination parts.
\wp_parse_str( $url_parts['query'], $query_parts );
$url = \trailingslashit( \remove_query_arg( \array_keys( $query_parts ), $url ) );
if ( $add_pagination_base ) {
$url .= \trailingslashit( $wp_rewrite->pagination_base );
}
// We can now re-add the query params, after appending the last pagination parts.
return \add_query_arg( $query_parts, \user_trailingslashit( $url . $page ) );
}
$url = \trailingslashit( $url );
if ( $add_pagination_base ) {
$url .= \trailingslashit( $wp_rewrite->pagination_base );
}
return \user_trailingslashit( $url . $page );
}
return \add_query_arg( $pagination_query_name, $page, \user_trailingslashit( $url ) );
}
/**
* Gets the number of archive pages.
*
* @return int The number of archive pages.
*/
public function get_number_of_archive_pages() {
$wp_query = $this->wp_query_wrapper->get_query();
return (int) $wp_query->max_num_pages;
}
/**
* Returns the current page for paged archives.
*
* @return int The current archive page.
*/
public function get_current_archive_page_number() {
$wp_query = $this->wp_query_wrapper->get_main_query();
$page_number = (int) $wp_query->get( 'paged' );
if ( $page_number > 1 ) {
return $page_number;
}
$query_loop_page_number = $this->get_page_number_from_query_loop();
if ( $query_loop_page_number ) {
return $query_loop_page_number;
}
return 0;
}
/**
* Returns the current page for paged post types.
*
* @return int The current post page.
*/
public function get_current_post_page_number() {
$wp_query = $this->wp_query_wrapper->get_main_query();
$query_loop_page_number = $this->get_page_number_from_query_loop();
if ( $query_loop_page_number ) {
return $query_loop_page_number;
}
return (int) $wp_query->get( 'page' );
}
/**
* Returns the current page number.
*
* @return int The current page number.
*/
public function get_current_page_number() {
// Get the page number for an archive page.
$page_number = \get_query_var( 'paged', 1 );
if ( $page_number > 1 ) {
return $page_number;
}
$query_loop_page_number = $this->get_page_number_from_query_loop();
if ( $query_loop_page_number ) {
return $query_loop_page_number;
}
// Get the page number for a page in a paginated post.
return \get_query_var( 'page', 1 );
}
/**
* Returns the key of the query loop.
*
* @return string The key of the query loop.
*/
public function get_key_query_loop() {
$regex_pattern = '/^query-\d+-page$/';
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- not form data.
foreach ( $_GET as $key => $value ) {
if ( \preg_match( $regex_pattern, $key ) ) {
return $key;
}
}
return '';
}
/**
* Returns the page number from the query loop.
*
* @return string The page number from the query loop.
*/
public function get_page_number_from_query_loop() {
$key_query_loop = $this->get_key_query_loop();
if ( $key_query_loop ) {
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated, WordPress.Security.NonceVerification.Recommended -- Validated in get_key_query_loop().
$page_number = (int) $_GET[ $key_query_loop ];
if ( $page_number > 1 ) {
return $page_number;
}
}
return '';
}
}