author | ymh <ymh.work@gmail.com> |
Mon, 14 Oct 2019 18:28:13 +0200 | |
changeset 9 | 177826044cd9 |
parent 7 | cf61fcea0001 |
child 16 | a86126ab1dd4 |
permissions | -rw-r--r-- |
0 | 1 |
<?php |
2 |
/** |
|
3 |
* Canonical API to handle WordPress Redirecting |
|
4 |
* |
|
5 |
* Based on "Permalink Redirect" from Scott Yang and "Enforce www. Preference" |
|
6 |
* by Mark Jaquith |
|
7 |
* |
|
8 |
* @package WordPress |
|
9 |
* @since 2.3.0 |
|
10 |
*/ |
|
11 |
||
12 |
/** |
|
13 |
* Redirects incoming links to the proper URL based on the site url. |
|
14 |
* |
|
15 |
* Search engines consider www.somedomain.com and somedomain.com to be two |
|
16 |
* different URLs when they both go to the same location. This SEO enhancement |
|
17 |
* prevents penalty for duplicate content by redirecting all incoming links to |
|
18 |
* one or the other. |
|
19 |
* |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
20 |
* Prevents redirection for feeds, trackbacks, searches, and |
0 | 21 |
* admin URLs. Does not redirect on non-pretty-permalink-supporting IIS 7+, |
22 |
* page/post previews, WP admin, Trackbacks, robots.txt, searches, or on POST |
|
23 |
* requests. |
|
24 |
* |
|
25 |
* Will also attempt to find the correct link when a user enters a URL that does |
|
26 |
* not exist based on exact WordPress query. Will instead try to parse the URL |
|
27 |
* or query in an attempt to figure the correct page to go to. |
|
28 |
* |
|
29 |
* @since 2.3.0 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
30 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
31 |
* @global WP_Rewrite $wp_rewrite |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
32 |
* @global bool $is_IIS |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
33 |
* @global WP_Query $wp_query |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
34 |
* @global wpdb $wpdb WordPress database abstraction object. |
9 | 35 |
* @global WP $wp Current WordPress environment instance. |
0 | 36 |
* |
37 |
* @param string $requested_url Optional. The URL that was requested, used to |
|
9 | 38 |
* figure if redirect is needed. |
0 | 39 |
* @param bool $do_redirect Optional. Redirect to the new URL. |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
40 |
* @return string|void The string of the URL, if redirect needed. |
0 | 41 |
*/ |
42 |
function redirect_canonical( $requested_url = null, $do_redirect = true ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
43 |
global $wp_rewrite, $is_IIS, $wp_query, $wpdb, $wp; |
0 | 44 |
|
5 | 45 |
if ( isset( $_SERVER['REQUEST_METHOD'] ) && ! in_array( strtoupper( $_SERVER['REQUEST_METHOD'] ), array( 'GET', 'HEAD' ) ) ) { |
0 | 46 |
return; |
5 | 47 |
} |
48 |
||
49 |
// If we're not in wp-admin and the post has been published and preview nonce |
|
50 |
// is non-existent or invalid then no need for preview in query |
|
51 |
if ( is_preview() && get_query_var( 'p' ) && 'publish' == get_post_status( get_query_var( 'p' ) ) ) { |
|
52 |
if ( ! isset( $_GET['preview_id'] ) |
|
53 |
|| ! isset( $_GET['preview_nonce'] ) |
|
54 |
|| ! wp_verify_nonce( $_GET['preview_nonce'], 'post_preview_' . (int) $_GET['preview_id'] ) ) { |
|
55 |
$wp_query->is_preview = false; |
|
56 |
} |
|
57 |
} |
|
58 |
||
9 | 59 |
if ( is_trackback() || is_search() || is_admin() || is_preview() || is_robots() || ( $is_IIS && ! iis7_supports_permalinks() ) ) { |
5 | 60 |
return; |
61 |
} |
|
0 | 62 |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
63 |
if ( ! $requested_url && isset( $_SERVER['HTTP_HOST'] ) ) { |
0 | 64 |
// build the URL in the address bar |
65 |
$requested_url = is_ssl() ? 'https://' : 'http://'; |
|
66 |
$requested_url .= $_SERVER['HTTP_HOST']; |
|
67 |
$requested_url .= $_SERVER['REQUEST_URI']; |
|
68 |
} |
|
69 |
||
9 | 70 |
$original = @parse_url( $requested_url ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
71 |
if ( false === $original ) { |
0 | 72 |
return; |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
73 |
} |
0 | 74 |
|
9 | 75 |
$redirect = $original; |
0 | 76 |
$redirect_url = false; |
77 |
||
78 |
// Notice fixing |
|
9 | 79 |
if ( ! isset( $redirect['path'] ) ) { |
0 | 80 |
$redirect['path'] = ''; |
9 | 81 |
} |
82 |
if ( ! isset( $redirect['query'] ) ) { |
|
0 | 83 |
$redirect['query'] = ''; |
9 | 84 |
} |
0 | 85 |
|
5 | 86 |
// If the original URL ended with non-breaking spaces, they were almost |
87 |
// certainly inserted by accident. Let's remove them, so the reader doesn't |
|
88 |
// see a 404 error with no obvious cause. |
|
89 |
$redirect['path'] = preg_replace( '|(%C2%A0)+$|i', '', $redirect['path'] ); |
|
90 |
||
91 |
// It's not a preview, so remove it from URL |
|
92 |
if ( get_query_var( 'preview' ) ) { |
|
93 |
$redirect['query'] = remove_query_arg( 'preview', $redirect['query'] ); |
|
94 |
} |
|
95 |
||
0 | 96 |
if ( is_feed() && ( $id = get_query_var( 'p' ) ) ) { |
97 |
if ( $redirect_url = get_post_comments_feed_link( $id, get_query_var( 'feed' ) ) ) { |
|
9 | 98 |
$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type', 'feed' ), $redirect_url ); |
99 |
$redirect['path'] = parse_url( $redirect_url, PHP_URL_PATH ); |
|
0 | 100 |
} |
101 |
} |
|
102 |
||
9 | 103 |
if ( is_singular() && 1 > $wp_query->post_count && ( $id = get_query_var( 'p' ) ) ) { |
0 | 104 |
|
9 | 105 |
$vars = $wpdb->get_results( $wpdb->prepare( "SELECT post_type, post_parent FROM $wpdb->posts WHERE ID = %d", $id ) ); |
0 | 106 |
|
9 | 107 |
if ( isset( $vars[0] ) && $vars = $vars[0] ) { |
108 |
if ( 'revision' == $vars->post_type && $vars->post_parent > 0 ) { |
|
0 | 109 |
$id = $vars->post_parent; |
9 | 110 |
} |
0 | 111 |
|
9 | 112 |
if ( $redirect_url = get_permalink( $id ) ) { |
0 | 113 |
$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); |
9 | 114 |
} |
0 | 115 |
} |
116 |
} |
|
117 |
||
118 |
// These tests give us a WP-generated permalink |
|
119 |
if ( is_404() ) { |
|
120 |
||
121 |
// Redirect ?page_id, ?p=, ?attachment_id= to their respective url's |
|
9 | 122 |
$id = max( get_query_var( 'p' ), get_query_var( 'page_id' ), get_query_var( 'attachment_id' ) ); |
123 |
if ( $id && $redirect_post = get_post( $id ) ) { |
|
124 |
$post_type_obj = get_post_type_object( $redirect_post->post_type ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
125 |
if ( $post_type_obj->public && 'auto-draft' != $redirect_post->post_status ) { |
9 | 126 |
$redirect_url = get_permalink( $redirect_post ); |
0 | 127 |
$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); |
128 |
} |
|
129 |
} |
|
130 |
||
131 |
if ( get_query_var( 'day' ) && get_query_var( 'monthnum' ) && get_query_var( 'year' ) ) { |
|
132 |
$year = get_query_var( 'year' ); |
|
133 |
$month = get_query_var( 'monthnum' ); |
|
134 |
$day = get_query_var( 'day' ); |
|
135 |
$date = sprintf( '%04d-%02d-%02d', $year, $month, $day ); |
|
136 |
if ( ! wp_checkdate( $month, $day, $year, $date ) ) { |
|
9 | 137 |
$redirect_url = get_month_link( $year, $month ); |
0 | 138 |
$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum', 'day' ), $redirect_url ); |
139 |
} |
|
140 |
} elseif ( get_query_var( 'monthnum' ) && get_query_var( 'year' ) && 12 < get_query_var( 'monthnum' ) ) { |
|
9 | 141 |
$redirect_url = get_year_link( get_query_var( 'year' ) ); |
0 | 142 |
$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum' ), $redirect_url ); |
143 |
} |
|
144 |
||
145 |
if ( ! $redirect_url ) { |
|
146 |
if ( $redirect_url = redirect_guess_404_permalink() ) { |
|
147 |
$redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'page', 'feed', 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); |
|
148 |
} |
|
149 |
} |
|
150 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
151 |
if ( get_query_var( 'page' ) && $wp_query->post && |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
152 |
false !== strpos( $wp_query->post->post_content, '<!--nextpage-->' ) ) { |
9 | 153 |
$redirect['path'] = rtrim( $redirect['path'], (int) get_query_var( 'page' ) . '/' ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
154 |
$redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); |
9 | 155 |
$redirect_url = get_permalink( $wp_query->post->ID ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
156 |
} |
9 | 157 |
} elseif ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) { |
0 | 158 |
// rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101 |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
159 |
if ( is_attachment() && |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
160 |
! array_diff( array_keys( $wp->query_vars ), array( 'attachment', 'attachment_id' ) ) && |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
161 |
! $redirect_url ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
162 |
if ( ! empty( $_GET['attachment_id'] ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
163 |
$redirect_url = get_attachment_link( get_query_var( 'attachment_id' ) ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
164 |
if ( $redirect_url ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
165 |
$redirect['query'] = remove_query_arg( 'attachment_id', $redirect['query'] ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
166 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
167 |
} else { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
168 |
$redirect_url = get_attachment_link(); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
169 |
} |
9 | 170 |
} elseif ( is_single() && ! empty( $_GET['p'] ) && ! $redirect_url ) { |
171 |
if ( $redirect_url = get_permalink( get_query_var( 'p' ) ) ) { |
|
172 |
$redirect['query'] = remove_query_arg( array( 'p', 'post_type' ), $redirect['query'] ); |
|
173 |
} |
|
174 |
} elseif ( is_single() && ! empty( $_GET['name'] ) && ! $redirect_url ) { |
|
175 |
if ( $redirect_url = get_permalink( $wp_query->get_queried_object_id() ) ) { |
|
176 |
$redirect['query'] = remove_query_arg( 'name', $redirect['query'] ); |
|
177 |
} |
|
178 |
} elseif ( is_page() && ! empty( $_GET['page_id'] ) && ! $redirect_url ) { |
|
179 |
if ( $redirect_url = get_permalink( get_query_var( 'page_id' ) ) ) { |
|
180 |
$redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); |
|
181 |
} |
|
182 |
} elseif ( is_page() && ! is_feed() && 'page' == get_option( 'show_on_front' ) && get_queried_object_id() == get_option( 'page_on_front' ) && ! $redirect_url ) { |
|
183 |
$redirect_url = home_url( '/' ); |
|
184 |
} elseif ( is_home() && ! empty( $_GET['page_id'] ) && 'page' == get_option( 'show_on_front' ) && get_query_var( 'page_id' ) == get_option( 'page_for_posts' ) && ! $redirect_url ) { |
|
185 |
if ( $redirect_url = get_permalink( get_option( 'page_for_posts' ) ) ) { |
|
186 |
$redirect['query'] = remove_query_arg( 'page_id', $redirect['query'] ); |
|
187 |
} |
|
188 |
} elseif ( ! empty( $_GET['m'] ) && ( is_year() || is_month() || is_day() ) ) { |
|
189 |
$m = get_query_var( 'm' ); |
|
190 |
switch ( strlen( $m ) ) { |
|
0 | 191 |
case 4: // Yearly |
9 | 192 |
$redirect_url = get_year_link( $m ); |
0 | 193 |
break; |
194 |
case 6: // Monthly |
|
9 | 195 |
$redirect_url = get_month_link( substr( $m, 0, 4 ), substr( $m, 4, 2 ) ); |
0 | 196 |
break; |
197 |
case 8: // Daily |
|
9 | 198 |
$redirect_url = get_day_link( substr( $m, 0, 4 ), substr( $m, 4, 2 ), substr( $m, 6, 2 ) ); |
0 | 199 |
break; |
200 |
} |
|
9 | 201 |
if ( $redirect_url ) { |
202 |
$redirect['query'] = remove_query_arg( 'm', $redirect['query'] ); |
|
203 |
} |
|
204 |
// now moving on to non ?m=X year/month/day links |
|
205 |
} elseif ( is_day() && get_query_var( 'year' ) && get_query_var( 'monthnum' ) && ! empty( $_GET['day'] ) ) { |
|
206 |
if ( $redirect_url = get_day_link( get_query_var( 'year' ), get_query_var( 'monthnum' ), get_query_var( 'day' ) ) ) { |
|
207 |
$redirect['query'] = remove_query_arg( array( 'year', 'monthnum', 'day' ), $redirect['query'] ); |
|
208 |
} |
|
209 |
} elseif ( is_month() && get_query_var( 'year' ) && ! empty( $_GET['monthnum'] ) ) { |
|
210 |
if ( $redirect_url = get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum' ) ) ) { |
|
211 |
$redirect['query'] = remove_query_arg( array( 'year', 'monthnum' ), $redirect['query'] ); |
|
212 |
} |
|
213 |
} elseif ( is_year() && ! empty( $_GET['year'] ) ) { |
|
214 |
if ( $redirect_url = get_year_link( get_query_var( 'year' ) ) ) { |
|
215 |
$redirect['query'] = remove_query_arg( 'year', $redirect['query'] ); |
|
216 |
} |
|
217 |
} elseif ( is_author() && ! empty( $_GET['author'] ) && preg_match( '|^[0-9]+$|', $_GET['author'] ) ) { |
|
218 |
$author = get_userdata( get_query_var( 'author' ) ); |
|
0 | 219 |
if ( ( false !== $author ) && $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_author = %d AND $wpdb->posts.post_status = 'publish' LIMIT 1", $author->ID ) ) ) { |
9 | 220 |
if ( $redirect_url = get_author_posts_url( $author->ID, $author->user_nicename ) ) { |
221 |
$redirect['query'] = remove_query_arg( 'author', $redirect['query'] ); |
|
222 |
} |
|
0 | 223 |
} |
224 |
} elseif ( is_category() || is_tag() || is_tax() ) { // Terms (Tags/categories) |
|
225 |
||
226 |
$term_count = 0; |
|
9 | 227 |
foreach ( $wp_query->tax_query->queried_terms as $tax_query ) { |
0 | 228 |
$term_count += count( $tax_query['terms'] ); |
9 | 229 |
} |
0 | 230 |
|
231 |
$obj = $wp_query->get_queried_object(); |
|
9 | 232 |
if ( $term_count <= 1 && ! empty( $obj->term_id ) && ( $tax_url = get_term_link( (int) $obj->term_id, $obj->taxonomy ) ) && ! is_wp_error( $tax_url ) ) { |
233 |
if ( ! empty( $redirect['query'] ) ) { |
|
0 | 234 |
// Strip taxonomy query vars off the url. |
9 | 235 |
$qv_remove = array( 'term', 'taxonomy' ); |
0 | 236 |
if ( is_category() ) { |
237 |
$qv_remove[] = 'category_name'; |
|
238 |
$qv_remove[] = 'cat'; |
|
239 |
} elseif ( is_tag() ) { |
|
240 |
$qv_remove[] = 'tag'; |
|
241 |
$qv_remove[] = 'tag_id'; |
|
242 |
} else { // Custom taxonomies will have a custom query var, remove those too: |
|
243 |
$tax_obj = get_taxonomy( $obj->taxonomy ); |
|
9 | 244 |
if ( false !== $tax_obj->query_var ) { |
0 | 245 |
$qv_remove[] = $tax_obj->query_var; |
9 | 246 |
} |
0 | 247 |
} |
248 |
||
9 | 249 |
$rewrite_vars = array_diff( array_keys( $wp_query->query ), array_keys( $_GET ) ); |
0 | 250 |
|
9 | 251 |
if ( ! array_diff( $rewrite_vars, array_keys( $_GET ) ) ) { // Check to see if all the Query vars are coming from the rewrite, none are set via $_GET |
252 |
$redirect['query'] = remove_query_arg( $qv_remove, $redirect['query'] ); //Remove all of the per-tax qv's |
|
0 | 253 |
|
254 |
// Create the destination url for this taxonomy |
|
9 | 255 |
$tax_url = parse_url( $tax_url ); |
256 |
if ( ! empty( $tax_url['query'] ) ) { // Taxonomy accessible via ?taxonomy=..&term=.. or any custom qv.. |
|
257 |
parse_str( $tax_url['query'], $query_vars ); |
|
258 |
$redirect['query'] = add_query_arg( $query_vars, $redirect['query'] ); |
|
0 | 259 |
} else { // Taxonomy is accessible via a "pretty-URL" |
260 |
$redirect['path'] = $tax_url['path']; |
|
261 |
} |
|
262 |
} else { // Some query vars are set via $_GET. Unset those from $_GET that exist via the rewrite |
|
263 |
foreach ( $qv_remove as $_qv ) { |
|
9 | 264 |
if ( isset( $rewrite_vars[ $_qv ] ) ) { |
265 |
$redirect['query'] = remove_query_arg( $_qv, $redirect['query'] ); |
|
266 |
} |
|
0 | 267 |
} |
268 |
} |
|
269 |
} |
|
270 |
} |
|
9 | 271 |
} elseif ( is_single() && strpos( $wp_rewrite->permalink_structure, '%category%' ) !== false && $cat = get_query_var( 'category_name' ) ) { |
0 | 272 |
$category = get_category_by_path( $cat ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
273 |
if ( ( ! $category || is_wp_error( $category ) ) || ! has_term( $category->term_id, 'category', $wp_query->get_queried_object_id() ) ) { |
9 | 274 |
$redirect_url = get_permalink( $wp_query->get_queried_object_id() ); |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
275 |
} |
0 | 276 |
} |
277 |
||
9 | 278 |
// Post Paging |
279 |
if ( is_singular() && get_query_var( 'page' ) ) { |
|
280 |
if ( ! $redirect_url ) { |
|
0 | 281 |
$redirect_url = get_permalink( get_queried_object_id() ); |
9 | 282 |
} |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
283 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
284 |
$page = get_query_var( 'page' ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
285 |
if ( $page > 1 ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
286 |
if ( is_front_page() ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
287 |
$redirect_url = trailingslashit( $redirect_url ) . user_trailingslashit( "$wp_rewrite->pagination_base/$page", 'paged' ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
288 |
} else { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
289 |
$redirect_url = trailingslashit( $redirect_url ) . user_trailingslashit( $page, 'single_paged' ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
290 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
291 |
} |
9 | 292 |
$redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); |
0 | 293 |
} |
294 |
||
9 | 295 |
// paging and feeds |
296 |
if ( get_query_var( 'paged' ) || is_feed() || get_query_var( 'cpage' ) ) { |
|
5 | 297 |
while ( preg_match( "#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#", $redirect['path'] ) || preg_match( '#/(comments/?)?(feed|rss|rdf|atom|rss2)(/+)?$#', $redirect['path'] ) || preg_match( "#/{$wp_rewrite->comments_pagination_base}-[0-9]+(/+)?$#", $redirect['path'] ) ) { |
0 | 298 |
// Strip off paging and feed |
9 | 299 |
$redirect['path'] = preg_replace( "#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#", '/', $redirect['path'] ); // strip off any existing paging |
300 |
$redirect['path'] = preg_replace( '#/(comments/?)?(feed|rss2?|rdf|atom)(/+|$)#', '/', $redirect['path'] ); // strip off feed endings |
|
301 |
$redirect['path'] = preg_replace( "#/{$wp_rewrite->comments_pagination_base}-[0-9]+?(/+)?$#", '/', $redirect['path'] ); // strip off any existing comment paging |
|
0 | 302 |
} |
303 |
||
304 |
$addl_path = ''; |
|
9 | 305 |
if ( is_feed() && in_array( get_query_var( 'feed' ), $wp_rewrite->feeds ) ) { |
306 |
$addl_path = ! empty( $addl_path ) ? trailingslashit( $addl_path ) : ''; |
|
307 |
if ( ! is_singular() && get_query_var( 'withcomments' ) ) { |
|
0 | 308 |
$addl_path .= 'comments/'; |
9 | 309 |
} |
310 |
if ( ( 'rss' == get_default_feed() && 'feed' == get_query_var( 'feed' ) ) || 'rss' == get_query_var( 'feed' ) ) { |
|
0 | 311 |
$addl_path .= user_trailingslashit( 'feed/' . ( ( get_default_feed() == 'rss2' ) ? '' : 'rss2' ), 'feed' ); |
9 | 312 |
} else { |
313 |
$addl_path .= user_trailingslashit( 'feed/' . ( ( get_default_feed() == get_query_var( 'feed' ) || 'feed' == get_query_var( 'feed' ) ) ? '' : get_query_var( 'feed' ) ), 'feed' ); |
|
314 |
} |
|
0 | 315 |
$redirect['query'] = remove_query_arg( 'feed', $redirect['query'] ); |
9 | 316 |
} elseif ( is_feed() && 'old' == get_query_var( 'feed' ) ) { |
0 | 317 |
$old_feed_files = array( |
318 |
'wp-atom.php' => 'atom', |
|
319 |
'wp-commentsrss2.php' => 'comments_rss2', |
|
320 |
'wp-feed.php' => get_default_feed(), |
|
321 |
'wp-rdf.php' => 'rdf', |
|
322 |
'wp-rss.php' => 'rss2', |
|
323 |
'wp-rss2.php' => 'rss2', |
|
324 |
); |
|
325 |
if ( isset( $old_feed_files[ basename( $redirect['path'] ) ] ) ) { |
|
326 |
$redirect_url = get_feed_link( $old_feed_files[ basename( $redirect['path'] ) ] ); |
|
327 |
wp_redirect( $redirect_url, 301 ); |
|
328 |
die(); |
|
329 |
} |
|
330 |
} |
|
331 |
||
9 | 332 |
if ( get_query_var( 'paged' ) > 0 ) { |
333 |
$paged = get_query_var( 'paged' ); |
|
0 | 334 |
$redirect['query'] = remove_query_arg( 'paged', $redirect['query'] ); |
9 | 335 |
if ( ! is_feed() ) { |
336 |
if ( $paged > 1 && ! is_single() ) { |
|
337 |
$addl_path = ( ! empty( $addl_path ) ? trailingslashit( $addl_path ) : '' ) . user_trailingslashit( "$wp_rewrite->pagination_base/$paged", 'paged' ); |
|
338 |
} elseif ( ! is_single() ) { |
|
339 |
$addl_path = ! empty( $addl_path ) ? trailingslashit( $addl_path ) : ''; |
|
0 | 340 |
} |
341 |
} elseif ( $paged > 1 ) { |
|
342 |
$redirect['query'] = add_query_arg( 'paged', $paged, $redirect['query'] ); |
|
343 |
} |
|
344 |
} |
|
345 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
346 |
if ( get_option( 'page_comments' ) && ( |
9 | 347 |
( 'newest' == get_option( 'default_comments_page' ) && get_query_var( 'cpage' ) > 0 ) || |
348 |
( 'newest' != get_option( 'default_comments_page' ) && get_query_var( 'cpage' ) > 1 ) |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
349 |
) ) { |
9 | 350 |
$addl_path = ( ! empty( $addl_path ) ? trailingslashit( $addl_path ) : '' ) . user_trailingslashit( $wp_rewrite->comments_pagination_base . '-' . get_query_var( 'cpage' ), 'commentpaged' ); |
0 | 351 |
$redirect['query'] = remove_query_arg( 'cpage', $redirect['query'] ); |
352 |
} |
|
353 |
||
9 | 354 |
$redirect['path'] = user_trailingslashit( preg_replace( '|/' . preg_quote( $wp_rewrite->index, '|' ) . '/?$|', '/', $redirect['path'] ) ); // strip off trailing /index.php/ |
355 |
if ( ! empty( $addl_path ) && $wp_rewrite->using_index_permalinks() && strpos( $redirect['path'], '/' . $wp_rewrite->index . '/' ) === false ) { |
|
356 |
$redirect['path'] = trailingslashit( $redirect['path'] ) . $wp_rewrite->index . '/'; |
|
357 |
} |
|
358 |
if ( ! empty( $addl_path ) ) { |
|
359 |
$redirect['path'] = trailingslashit( $redirect['path'] ) . $addl_path; |
|
360 |
} |
|
0 | 361 |
$redirect_url = $redirect['scheme'] . '://' . $redirect['host'] . $redirect['path']; |
362 |
} |
|
363 |
||
364 |
if ( 'wp-register.php' == basename( $redirect['path'] ) ) { |
|
5 | 365 |
if ( is_multisite() ) { |
0 | 366 |
/** This filter is documented in wp-login.php */ |
367 |
$redirect_url = apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ); |
|
5 | 368 |
} else { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
369 |
$redirect_url = wp_registration_url(); |
5 | 370 |
} |
371 |
||
0 | 372 |
wp_redirect( $redirect_url, 301 ); |
373 |
die(); |
|
374 |
} |
|
375 |
} |
|
376 |
||
377 |
// tack on any additional query vars |
|
378 |
$redirect['query'] = preg_replace( '#^\??&*?#', '', $redirect['query'] ); |
|
9 | 379 |
if ( $redirect_url && ! empty( $redirect['query'] ) ) { |
0 | 380 |
parse_str( $redirect['query'], $_parsed_query ); |
9 | 381 |
$redirect = @parse_url( $redirect_url ); |
0 | 382 |
|
383 |
if ( ! empty( $_parsed_query['name'] ) && ! empty( $redirect['query'] ) ) { |
|
384 |
parse_str( $redirect['query'], $_parsed_redirect_query ); |
|
385 |
||
9 | 386 |
if ( empty( $_parsed_redirect_query['name'] ) ) { |
0 | 387 |
unset( $_parsed_query['name'] ); |
9 | 388 |
} |
0 | 389 |
} |
390 |
||
9 | 391 |
$_parsed_query = array_combine( |
392 |
rawurlencode_deep( array_keys( $_parsed_query ) ), |
|
393 |
rawurlencode_deep( array_values( $_parsed_query ) ) |
|
394 |
); |
|
395 |
$redirect_url = add_query_arg( $_parsed_query, $redirect_url ); |
|
0 | 396 |
} |
397 |
||
9 | 398 |
if ( $redirect_url ) { |
399 |
$redirect = @parse_url( $redirect_url ); |
|
400 |
} |
|
0 | 401 |
|
402 |
// www.example.com vs example.com |
|
9 | 403 |
$user_home = @parse_url( home_url() ); |
404 |
if ( ! empty( $user_home['host'] ) ) { |
|
0 | 405 |
$redirect['host'] = $user_home['host']; |
9 | 406 |
} |
407 |
if ( empty( $user_home['path'] ) ) { |
|
0 | 408 |
$user_home['path'] = '/'; |
9 | 409 |
} |
0 | 410 |
|
411 |
// Handle ports |
|
9 | 412 |
if ( ! empty( $user_home['port'] ) ) { |
0 | 413 |
$redirect['port'] = $user_home['port']; |
9 | 414 |
} else { |
415 |
unset( $redirect['port'] ); |
|
416 |
} |
|
0 | 417 |
|
418 |
// trailing /index.php |
|
9 | 419 |
$redirect['path'] = preg_replace( '|/' . preg_quote( $wp_rewrite->index, '|' ) . '/*?$|', '/', $redirect['path'] ); |
0 | 420 |
|
9 | 421 |
$punctuation_pattern = implode( |
422 |
'|', |
|
423 |
array_map( |
|
424 |
'preg_quote', |
|
425 |
array( |
|
426 |
' ', |
|
427 |
'%20', // space |
|
428 |
'!', |
|
429 |
'%21', // exclamation mark |
|
430 |
'"', |
|
431 |
'%22', // double quote |
|
432 |
"'", |
|
433 |
'%27', // single quote |
|
434 |
'(', |
|
435 |
'%28', // opening bracket |
|
436 |
')', |
|
437 |
'%29', // closing bracket |
|
438 |
',', |
|
439 |
'%2C', // comma |
|
440 |
'.', |
|
441 |
'%2E', // period |
|
442 |
';', |
|
443 |
'%3B', // semicolon |
|
444 |
'{', |
|
445 |
'%7B', // opening curly bracket |
|
446 |
'}', |
|
447 |
'%7D', // closing curly bracket |
|
448 |
'%E2%80%9C', // opening curly quote |
|
449 |
'%E2%80%9D', // closing curly quote |
|
450 |
) |
|
451 |
) |
|
452 |
); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
453 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
454 |
// Remove trailing spaces and end punctuation from the path. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
455 |
$redirect['path'] = preg_replace( "#($punctuation_pattern)+$#", '', $redirect['path'] ); |
0 | 456 |
|
9 | 457 |
if ( ! empty( $redirect['query'] ) ) { |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
458 |
// Remove trailing spaces and end punctuation from certain terminating query string args. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
459 |
$redirect['query'] = preg_replace( "#((p|page_id|cat|tag)=[^&]*?)($punctuation_pattern)+$#", '$1', $redirect['query'] ); |
0 | 460 |
|
461 |
// Clean up empty query strings |
|
9 | 462 |
$redirect['query'] = trim( preg_replace( '#(^|&)(p|page_id|cat|tag)=?(&|$)#', '&', $redirect['query'] ), '&' ); |
0 | 463 |
|
464 |
// Redirect obsolete feeds |
|
465 |
$redirect['query'] = preg_replace( '#(^|&)feed=rss(&|$)#', '$1feed=rss2$2', $redirect['query'] ); |
|
466 |
||
467 |
// Remove redundant leading ampersands |
|
468 |
$redirect['query'] = preg_replace( '#^\??&*?#', '', $redirect['query'] ); |
|
469 |
} |
|
470 |
||
471 |
// strip /index.php/ when we're not using PATHINFO permalinks |
|
9 | 472 |
if ( ! $wp_rewrite->using_index_permalinks() ) { |
0 | 473 |
$redirect['path'] = str_replace( '/' . $wp_rewrite->index . '/', '/', $redirect['path'] ); |
9 | 474 |
} |
0 | 475 |
|
476 |
// trailing slashes |
|
9 | 477 |
if ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() && ! is_404() && ( ! is_front_page() || ( is_front_page() && ( get_query_var( 'paged' ) > 1 ) ) ) ) { |
0 | 478 |
$user_ts_type = ''; |
9 | 479 |
if ( get_query_var( 'paged' ) > 0 ) { |
0 | 480 |
$user_ts_type = 'paged'; |
481 |
} else { |
|
9 | 482 |
foreach ( array( 'single', 'category', 'page', 'day', 'month', 'year', 'home' ) as $type ) { |
0 | 483 |
$func = 'is_' . $type; |
9 | 484 |
if ( call_user_func( $func ) ) { |
0 | 485 |
$user_ts_type = $type; |
486 |
break; |
|
487 |
} |
|
488 |
} |
|
489 |
} |
|
9 | 490 |
$redirect['path'] = user_trailingslashit( $redirect['path'], $user_ts_type ); |
0 | 491 |
} elseif ( is_front_page() ) { |
9 | 492 |
$redirect['path'] = trailingslashit( $redirect['path'] ); |
0 | 493 |
} |
494 |
||
495 |
// Strip multiple slashes out of the URL |
|
9 | 496 |
if ( strpos( $redirect['path'], '//' ) > -1 ) { |
497 |
$redirect['path'] = preg_replace( '|/+|', '/', $redirect['path'] ); |
|
498 |
} |
|
0 | 499 |
|
500 |
// Always trailing slash the Front Page URL |
|
9 | 501 |
if ( trailingslashit( $redirect['path'] ) == trailingslashit( $user_home['path'] ) ) { |
502 |
$redirect['path'] = trailingslashit( $redirect['path'] ); |
|
503 |
} |
|
0 | 504 |
|
505 |
// Ignore differences in host capitalization, as this can lead to infinite redirects |
|
506 |
// Only redirect no-www <=> yes-www |
|
9 | 507 |
if ( strtolower( $original['host'] ) == strtolower( $redirect['host'] ) || |
508 |
( strtolower( $original['host'] ) != 'www.' . strtolower( $redirect['host'] ) && 'www.' . strtolower( $original['host'] ) != strtolower( $redirect['host'] ) ) ) { |
|
0 | 509 |
$redirect['host'] = $original['host']; |
9 | 510 |
} |
0 | 511 |
|
5 | 512 |
$compare_original = array( $original['host'], $original['path'] ); |
0 | 513 |
|
9 | 514 |
if ( ! empty( $original['port'] ) ) { |
0 | 515 |
$compare_original[] = $original['port']; |
9 | 516 |
} |
0 | 517 |
|
9 | 518 |
if ( ! empty( $original['query'] ) ) { |
0 | 519 |
$compare_original[] = $original['query']; |
9 | 520 |
} |
0 | 521 |
|
5 | 522 |
$compare_redirect = array( $redirect['host'], $redirect['path'] ); |
0 | 523 |
|
9 | 524 |
if ( ! empty( $redirect['port'] ) ) { |
0 | 525 |
$compare_redirect[] = $redirect['port']; |
9 | 526 |
} |
0 | 527 |
|
9 | 528 |
if ( ! empty( $redirect['query'] ) ) { |
0 | 529 |
$compare_redirect[] = $redirect['query']; |
9 | 530 |
} |
0 | 531 |
|
532 |
if ( $compare_original !== $compare_redirect ) { |
|
533 |
$redirect_url = $redirect['scheme'] . '://' . $redirect['host']; |
|
9 | 534 |
if ( ! empty( $redirect['port'] ) ) { |
0 | 535 |
$redirect_url .= ':' . $redirect['port']; |
9 | 536 |
} |
0 | 537 |
$redirect_url .= $redirect['path']; |
9 | 538 |
if ( ! empty( $redirect['query'] ) ) { |
0 | 539 |
$redirect_url .= '?' . $redirect['query']; |
9 | 540 |
} |
0 | 541 |
} |
542 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
543 |
if ( ! $redirect_url || $redirect_url == $requested_url ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
544 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
545 |
} |
0 | 546 |
|
547 |
// Hex encoded octets are case-insensitive. |
|
9 | 548 |
if ( false !== strpos( $requested_url, '%' ) ) { |
549 |
if ( ! function_exists( 'lowercase_octets' ) ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
550 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
551 |
* Converts the first hex-encoded octet match to lowercase. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
552 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
553 |
* @since 3.1.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
554 |
* @ignore |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
555 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
556 |
* @param array $matches Hex-encoded octet matches for the requested URL. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
557 |
* @return string Lowercased version of the first match. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
558 |
*/ |
9 | 559 |
function lowercase_octets( $matches ) { |
0 | 560 |
return strtolower( $matches[0] ); |
561 |
} |
|
562 |
} |
|
9 | 563 |
$requested_url = preg_replace_callback( '|%[a-fA-F0-9][a-fA-F0-9]|', 'lowercase_octets', $requested_url ); |
0 | 564 |
} |
565 |
||
566 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
567 |
* Filters the canonical redirect URL. |
0 | 568 |
* |
569 |
* Returning false to this filter will cancel the redirect. |
|
570 |
* |
|
571 |
* @since 2.3.0 |
|
572 |
* |
|
573 |
* @param string $redirect_url The redirect URL. |
|
574 |
* @param string $requested_url The requested URL. |
|
575 |
*/ |
|
576 |
$redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url ); |
|
577 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
578 |
// yes, again -- in case the filter aborted the request |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
579 |
if ( ! $redirect_url || strip_fragment_from_url( $redirect_url ) == strip_fragment_from_url( $requested_url ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
580 |
return; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
581 |
} |
0 | 582 |
|
583 |
if ( $do_redirect ) { |
|
584 |
// protect against chained redirects |
|
9 | 585 |
if ( ! redirect_canonical( $redirect_url, false ) ) { |
586 |
wp_redirect( $redirect_url, 301 ); |
|
0 | 587 |
exit(); |
588 |
} else { |
|
589 |
// Debug |
|
590 |
// die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) ); |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
591 |
return; |
0 | 592 |
} |
593 |
} else { |
|
594 |
return $redirect_url; |
|
595 |
} |
|
596 |
} |
|
597 |
||
598 |
/** |
|
599 |
* Removes arguments from a query string if they are not present in a URL |
|
600 |
* DO NOT use this in plugin code. |
|
601 |
* |
|
5 | 602 |
* @since 3.4.0 |
0 | 603 |
* @access private |
604 |
* |
|
5 | 605 |
* @param string $query_string |
606 |
* @param array $args_to_check |
|
607 |
* @param string $url |
|
0 | 608 |
* @return string The altered query string |
609 |
*/ |
|
9 | 610 |
function _remove_qs_args_if_not_in_url( $query_string, array $args_to_check, $url ) { |
0 | 611 |
$parsed_url = @parse_url( $url ); |
612 |
if ( ! empty( $parsed_url['query'] ) ) { |
|
613 |
parse_str( $parsed_url['query'], $parsed_query ); |
|
614 |
foreach ( $args_to_check as $qv ) { |
|
9 | 615 |
if ( ! isset( $parsed_query[ $qv ] ) ) { |
0 | 616 |
$query_string = remove_query_arg( $qv, $query_string ); |
9 | 617 |
} |
0 | 618 |
} |
619 |
} else { |
|
620 |
$query_string = remove_query_arg( $args_to_check, $query_string ); |
|
621 |
} |
|
622 |
return $query_string; |
|
623 |
} |
|
624 |
||
625 |
/** |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
626 |
* Strips the #fragment from a URL, if one is present. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
627 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
628 |
* @since 4.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
629 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
630 |
* @param string $url The URL to strip. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
631 |
* @return string The altered URL. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
632 |
*/ |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
633 |
function strip_fragment_from_url( $url ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
634 |
$parsed_url = @parse_url( $url ); |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
635 |
if ( ! empty( $parsed_url['host'] ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
636 |
// This mirrors code in redirect_canonical(). It does not handle every case. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
637 |
$url = $parsed_url['scheme'] . '://' . $parsed_url['host']; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
638 |
if ( ! empty( $parsed_url['port'] ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
639 |
$url .= ':' . $parsed_url['port']; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
640 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
641 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
642 |
if ( ! empty( $parsed_url['path'] ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
643 |
$url .= $parsed_url['path']; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
644 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
645 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
646 |
if ( ! empty( $parsed_url['query'] ) ) { |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
647 |
$url .= '?' . $parsed_url['query']; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
648 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
649 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
650 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
651 |
return $url; |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
652 |
} |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
653 |
|
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
654 |
/** |
0 | 655 |
* Attempts to guess the correct URL based on query vars |
656 |
* |
|
657 |
* @since 2.3.0 |
|
5 | 658 |
* |
659 |
* @global wpdb $wpdb WordPress database abstraction object. |
|
0 | 660 |
* |
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
661 |
* @return false|string The correct URL if one is found. False on failure. |
0 | 662 |
*/ |
663 |
function redirect_guess_404_permalink() { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
664 |
global $wpdb; |
0 | 665 |
|
9 | 666 |
if ( get_query_var( 'name' ) ) { |
667 |
$where = $wpdb->prepare( 'post_name LIKE %s', $wpdb->esc_like( get_query_var( 'name' ) ) . '%' ); |
|
0 | 668 |
|
669 |
// if any of post_type, year, monthnum, or day are set, use them to refine the query |
|
9 | 670 |
if ( get_query_var( 'post_type' ) ) { |
671 |
$where .= $wpdb->prepare( ' AND post_type = %s', get_query_var( 'post_type' ) ); |
|
672 |
} else { |
|
0 | 673 |
$where .= " AND post_type IN ('" . implode( "', '", get_post_types( array( 'public' => true ) ) ) . "')"; |
9 | 674 |
} |
0 | 675 |
|
9 | 676 |
if ( get_query_var( 'year' ) ) { |
677 |
$where .= $wpdb->prepare( ' AND YEAR(post_date) = %d', get_query_var( 'year' ) ); |
|
678 |
} |
|
679 |
if ( get_query_var( 'monthnum' ) ) { |
|
680 |
$where .= $wpdb->prepare( ' AND MONTH(post_date) = %d', get_query_var( 'monthnum' ) ); |
|
681 |
} |
|
682 |
if ( get_query_var( 'day' ) ) { |
|
683 |
$where .= $wpdb->prepare( ' AND DAYOFMONTH(post_date) = %d', get_query_var( 'day' ) ); |
|
684 |
} |
|
0 | 685 |
|
9 | 686 |
$post_id = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'" ); |
687 |
if ( ! $post_id ) { |
|
0 | 688 |
return false; |
9 | 689 |
} |
690 |
if ( get_query_var( 'feed' ) ) { |
|
0 | 691 |
return get_post_comments_feed_link( $post_id, get_query_var( 'feed' ) ); |
9 | 692 |
} elseif ( get_query_var( 'page' ) && 1 < get_query_var( 'page' ) ) { |
0 | 693 |
return trailingslashit( get_permalink( $post_id ) ) . user_trailingslashit( get_query_var( 'page' ), 'single_paged' ); |
9 | 694 |
} else { |
0 | 695 |
return get_permalink( $post_id ); |
9 | 696 |
} |
0 | 697 |
} |
698 |
||
699 |
return false; |
|
700 |
} |
|
701 |
||
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
702 |
/** |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
703 |
* Redirects a variety of shorthand URLs to the admin. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
704 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
705 |
* If a user visits example.com/admin, they'll be redirected to /wp-admin. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
706 |
* Visiting /login redirects to /wp-login.php, and so on. |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
707 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
708 |
* @since 3.4.0 |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
709 |
* |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
710 |
* @global WP_Rewrite $wp_rewrite |
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
711 |
*/ |
0 | 712 |
function wp_redirect_admin_locations() { |
713 |
global $wp_rewrite; |
|
9 | 714 |
if ( ! ( is_404() && $wp_rewrite->using_permalinks() ) ) { |
0 | 715 |
return; |
9 | 716 |
} |
0 | 717 |
|
718 |
$admins = array( |
|
719 |
home_url( 'wp-admin', 'relative' ), |
|
720 |
home_url( 'dashboard', 'relative' ), |
|
721 |
home_url( 'admin', 'relative' ), |
|
722 |
site_url( 'dashboard', 'relative' ), |
|
723 |
site_url( 'admin', 'relative' ), |
|
724 |
); |
|
725 |
if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $admins ) ) { |
|
726 |
wp_redirect( admin_url() ); |
|
727 |
exit; |
|
728 |
} |
|
729 |
||
730 |
$logins = array( |
|
731 |
home_url( 'wp-login.php', 'relative' ), |
|
732 |
home_url( 'login', 'relative' ), |
|
733 |
site_url( 'login', 'relative' ), |
|
734 |
); |
|
735 |
if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $logins ) ) { |
|
7
cf61fcea0001
resynchronize code repo with production
ymh <ymh.work@gmail.com>
parents:
5
diff
changeset
|
736 |
wp_redirect( wp_login_url() ); |
0 | 737 |
exit; |
738 |
} |
|
739 |
} |