PluginProbe
Bogo / 3.9.3
Bogo v3.9.3
3.9.3 trunk 1.0 1.1 2.0 2.0.1 2.1 2.1.1 2.1.2 2.1.3 2.2 2.3 2.4 2.4.1 2.4.2 2.4.3 2.5 2.6 2.6.1 2.7 2.8 2.8.1 2.9 3.0 3.0.1 All 52 releases
bogo / includes / rewrite.php

rewrite.php in Bogo 3.9.3, at includes/rewrite.php

525 lines 13.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 add_action( 'init', 'bogo_add_rewrite_tags', 10, 0 );
4
5 function bogo_add_rewrite_tags() {
6 $regex = bogo_get_lang_regex();
7
8 if ( empty( $regex ) ) {
9 return;
10 }
11
12 add_rewrite_tag( '%lang%', $regex, 'lang=' );
13
14 $old_regex = bogo_get_prop( 'lang_rewrite_regex' );
15
16 if ( $regex !== $old_regex ) {
17 bogo_set_prop( 'lang_rewrite_regex', $regex );
18 flush_rewrite_rules();
19 }
20 }
21
22
23 add_filter( 'rewrite_rules_array', 'bogo_rewrite_rules_array', 10, 1 );
24
25 function bogo_rewrite_rules_array( $rules ) {
26 global $wp_rewrite;
27
28 $lang_regex = bogo_get_lang_regex();
29
30 $extra_rules = array();
31
32 if ( $rest_url_prefix = rest_get_url_prefix() ) {
33 $extra_rules += array(
34 "{$lang_regex}/{$rest_url_prefix}/?$"
35 => 'index.php?lang=$matches[1]&rest_route=/',
36 "{$lang_regex}/{$rest_url_prefix}/(.*)?"
37 => 'index.php?lang=$matches[1]&rest_route=/$matches[2]',
38 "{$wp_rewrite->index}/{$lang_regex}/{$rest_url_prefix}/?$"
39 => 'index.php?lang=$matches[1]&rest_route=/',
40 "{$wp_rewrite->index}/{$lang_regex}/{$rest_url_prefix}/(.*)?"
41 => 'index.php?lang=$matches[1]&rest_route=/$matches[2]',
42 );
43 }
44
45 $localizable_post_types = bogo_localizable_post_types();
46
47 foreach ( $localizable_post_types as $post_type ) {
48 if (
49 ! $post_type_obj = get_post_type_object( $post_type ) or
50 false === $post_type_obj->rewrite
51 ) {
52 continue;
53 }
54
55 if ( $post_type_obj->has_archive ) {
56 if ( $post_type_obj->has_archive === true ) {
57 $archive_slug = $post_type_obj->rewrite['slug'];
58 } else {
59 $archive_slug = $post_type_obj->has_archive;
60 }
61
62 if ( $post_type_obj->rewrite['with_front'] ) {
63 $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
64 } else {
65 $archive_slug = $wp_rewrite->root . $archive_slug;
66 }
67
68 $extra_rules += array(
69 "{$lang_regex}/{$archive_slug}/?$"
70 => 'index.php?lang=$matches[1]&post_type=' . $post_type,
71 );
72
73 if ( $post_type_obj->rewrite['feeds'] and $wp_rewrite->feeds ) {
74 $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
75
76 $extra_rules += array(
77 "{$lang_regex}/{$archive_slug}/feed/$feeds/?$"
78 => 'index.php?lang=$matches[1]&post_type=' . $post_type . '&feed=$matches[2]',
79 "{$lang_regex}/{$archive_slug}/$feeds/?$"
80 => 'index.php?lang=$matches[1]&post_type=' . $post_type . '&feed=$matches[2]',
81 );
82 }
83
84 if ( $post_type_obj->rewrite['pages'] ) {
85 $extra_rules += array(
86 "{$lang_regex}/{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$"
87 => 'index.php?lang=$matches[1]&post_type=' . $post_type . '&paged=$matches[2]',
88 );
89 }
90 }
91
92 $permastruct = $wp_rewrite->get_extra_permastruct( $post_type );
93 $permastruct = bogo_add_lang_to_permastruct( $permastruct );
94
95 $extra_rules += bogo_generate_rewrite_rules(
96 $permastruct,
97 $post_type_obj->rewrite
98 );
99 }
100
101 $localizable_taxonomies = get_object_taxonomies(
102 $localizable_post_types,
103 'objects'
104 );
105
106 foreach ( $localizable_taxonomies as $taxonomy ) {
107 if ( empty( $taxonomy->rewrite ) ) {
108 continue;
109 }
110
111 $permastruct = $wp_rewrite->get_extra_permastruct( $taxonomy->name );
112 $permastruct = bogo_add_lang_to_permastruct( $permastruct );
113
114 $extra_rules += bogo_generate_rewrite_rules(
115 $permastruct,
116 $taxonomy->rewrite
117 );
118 }
119
120 $root_rules = bogo_generate_rewrite_rules(
121 bogo_add_lang_to_permastruct( $wp_rewrite->root ),
122 array( 'ep_mask' => EP_ROOT )
123 );
124
125 $comments_rules = bogo_generate_rewrite_rules(
126 bogo_add_lang_to_permastruct(
127 $wp_rewrite->root . $wp_rewrite->comments_base
128 ),
129 array(
130 'ep_mask' => EP_COMMENTS,
131 'forcomments' => true,
132 'walk_dirs' => false,
133 )
134 );
135
136 $search_rules = bogo_generate_rewrite_rules(
137 bogo_add_lang_to_permastruct( $wp_rewrite->get_search_permastruct() ),
138 array( 'ep_mask' => EP_SEARCH )
139 );
140
141 $author_rules = bogo_generate_rewrite_rules(
142 bogo_add_lang_to_permastruct( $wp_rewrite->get_author_permastruct() ),
143 array( 'ep_mask' => EP_AUTHORS )
144 );
145
146 $date_rules = bogo_generate_rewrite_rules(
147 bogo_add_lang_to_permastruct( $wp_rewrite->get_date_permastruct() ),
148 array( 'ep_mask' => EP_DATE )
149 );
150
151 $post_rules = bogo_generate_rewrite_rules(
152 bogo_add_lang_to_permastruct( $wp_rewrite->permalink_structure ),
153 array(
154 'ep_mask' => EP_PERMALINK,
155 'paged' => false,
156 )
157 );
158
159 $wp_rewrite->add_rewrite_tag( '%pagename%', '(.?.+?)', 'pagename=' );
160
161 $page_rules = bogo_generate_rewrite_rules(
162 bogo_add_lang_to_permastruct( $wp_rewrite->get_page_permastruct() ),
163 array(
164 'ep_mask' => EP_PAGES,
165 'walk_dirs' => false,
166 )
167 );
168
169 if ( $wp_rewrite->use_verbose_page_rules ) {
170 $rules = array_merge(
171 $extra_rules,
172 $root_rules,
173 $comments_rules,
174 $search_rules,
175 $author_rules,
176 $date_rules,
177 $page_rules,
178 $post_rules,
179 $rules
180 );
181 } else {
182 $rules = array_merge(
183 $extra_rules,
184 $root_rules,
185 $comments_rules,
186 $search_rules,
187 $author_rules,
188 $date_rules,
189 $post_rules,
190 $page_rules,
191 $rules
192 );
193 }
194
195 return $rules;
196 }
197
198
199 function bogo_add_lang_to_permastruct( $permastruct ) {
200 global $wp_rewrite;
201
202 $root_quoted = preg_quote( $wp_rewrite->root );
203
204 $remains = preg_replace( "#^{$root_quoted}#", '', $permastruct );
205 $remains = path_join( '%lang%', ltrim( $remains, '/' ) );
206
207 return path_join( $wp_rewrite->root, $remains );
208 }
209
210
211 function bogo_generate_rewrite_rules( $permalink_structure, $args = '' ) {
212 global $wp_rewrite;
213
214 $args = wp_parse_args( $args, array(
215 'ep_mask' => EP_NONE,
216 'paged' => true,
217 'feed' => true,
218 'forcomments' => false,
219 'walk_dirs' => true,
220 'endpoints' => true,
221 ) );
222
223 if ( ! str_contains( $permalink_structure, '%lang%' ) ) {
224 return array();
225 }
226
227 $feedregex2 = '(' . implode( '|', $wp_rewrite->feeds ) . ')/?$';
228 $feedregex = $wp_rewrite->feed_base . '/' . $feedregex2;
229 $trackbackregex = 'trackback/?$';
230 $pageregex = $wp_rewrite->pagination_base . '/?([0-9]{1,})/?$';
231 $commentregex = $wp_rewrite->comments_pagination_base . '-([0-9]{1,})/?$';
232 $embedregex = 'embed/?$';
233
234 if ( $args['endpoints'] ) {
235 $ep_query_append = array();
236
237 foreach ( (array) $wp_rewrite->endpoints as $endpoint ) {
238 $epmatch = $endpoint[1] . '(/(.*))?/?$';
239 $epquery = '&' . $endpoint[2] . '=';
240 $ep_query_append[$epmatch] = array( $endpoint[0], $epquery );
241 }
242 }
243
244 $front = substr(
245 $permalink_structure,
246 0,
247 strpos( $permalink_structure, '%' )
248 );
249
250 preg_match_all( '/%.+?%/', $permalink_structure, $tokens );
251
252 $index = $wp_rewrite->index;
253 $feedindex = $index;
254 $trackbackindex = $index;
255 $embedindex = $index;
256
257 $queries = array();
258
259 for ( $i = 0; $i < count( $tokens[0] ); ++$i ) {
260 if ( 0 < $i ) {
261 $queries[$i] = $queries[$i - 1] . '&';
262 } else {
263 $queries[$i] = '';
264 }
265
266 $query_token = str_replace(
267 $wp_rewrite->rewritecode,
268 $wp_rewrite->queryreplace,
269 $tokens[0][$i]
270 ) . $wp_rewrite->preg_index( $i + 1 );
271
272 $queries[$i] .= $query_token;
273 }
274
275 $structure = $permalink_structure;
276
277 if ( '/' !== $front ) {
278 $structure = str_replace( $front, '', $structure );
279 }
280
281 $structure = trim( $structure, '/' );
282
283 $dirs = $args['walk_dirs']
284 ? explode( '/', $structure )
285 : array( $structure );
286
287 $front = preg_replace( '|^/+|', '', $front );
288
289 $post_rewrite = array();
290 $struct = $front;
291
292 for ( $j = 0; $j < count( $dirs ); ++$j ) {
293 $struct .= $dirs[$j] . '/';
294 $struct = ltrim( $struct, '/' );
295
296 $match = str_replace(
297 $wp_rewrite->rewritecode,
298 $wp_rewrite->rewritereplace,
299 $struct
300 );
301
302 $num_toks = preg_match_all( '/%.+?%/', $struct, $toks );
303
304 if ( $num_toks < count( $tokens[0] ) and $toks[0] === array( '%lang%' ) ) {
305 continue;
306 }
307
308 $query = ( ! empty( $num_toks ) && isset( $queries[$num_toks - 1] ) )
309 ? $queries[$num_toks - 1]
310 : '';
311
312 switch ( $dirs[$j] ) {
313 case '%year%':
314 $ep_mask_specific = EP_YEAR;
315 break;
316 case '%monthnum%':
317 $ep_mask_specific = EP_MONTH;
318 break;
319 case '%day%':
320 $ep_mask_specific = EP_DAY;
321 break;
322 default:
323 $ep_mask_specific = EP_NONE;
324 }
325
326 $pagematch = $match . $pageregex;
327 $pagequery = $index . '?' . $query
328 . '&paged=' . $wp_rewrite->preg_index( $num_toks + 1 );
329
330 $commentmatch = $match . $commentregex;
331 $commentquery = $index . '?' . $query
332 . '&cpage=' . $wp_rewrite->preg_index( $num_toks + 1 );
333
334 if ( get_option( 'page_on_front' ) ) {
335 $rootcommentmatch = $match . $commentregex;
336 $rootcommentquery = $index . '?' . $query
337 . '&page_id=' . get_option( 'page_on_front' )
338 . '&cpage=' . $wp_rewrite->preg_index( $num_toks + 1 );
339 }
340
341 $feedmatch = $match . $feedregex;
342 $feedquery = $feedindex . '?' . $query
343 . '&feed=' . $wp_rewrite->preg_index( $num_toks + 1 );
344
345 $feedmatch2 = $match . $feedregex2;
346 $feedquery2 = $feedindex . '?' . $query
347 . '&feed=' . $wp_rewrite->preg_index( $num_toks + 1 );
348
349 $embedmatch = $match . $embedregex;
350 $embedquery = $embedindex . '?' . $query . '&embed=true';
351
352 if ( $args['forcomments'] ) {
353 $feedquery .= '&withcomments=1';
354 $feedquery2 .= '&withcomments=1';
355 }
356
357 $rewrite = array();
358
359 if ( $args['feed'] ) {
360 $rewrite = array(
361 $feedmatch => $feedquery,
362 $feedmatch2 => $feedquery2,
363 $embedmatch => $embedquery,
364 );
365 }
366
367 if ( $args['paged'] ) {
368 $rewrite = array_merge(
369 $rewrite,
370 array( $pagematch => $pagequery )
371 );
372 }
373
374 if ( EP_PAGES & $args['ep_mask'] or EP_PERMALINK & $args['ep_mask'] ) {
375 $rewrite = array_merge(
376 $rewrite,
377 array( $commentmatch => $commentquery )
378 );
379 } elseif ( EP_ROOT & $args['ep_mask'] and get_option( 'page_on_front' ) ) {
380 $rewrite = array_merge(
381 $rewrite,
382 array( $rootcommentmatch => $rootcommentquery )
383 );
384 }
385
386 if ( $args['endpoints'] ) {
387 foreach ( (array) $ep_query_append as $regex => $ep ) {
388 if ( $ep[0] & $args['ep_mask'] or $ep[0] & $ep_mask_specific ) {
389 $rewrite[$match . $regex] = $index . '?' . $query
390 . $ep[1] . $wp_rewrite->preg_index( $num_toks + 2 );
391 }
392 }
393 }
394
395 if ( $num_toks ) {
396 $post = false;
397 $page = false;
398
399 if (
400 str_contains( $struct, '%postname%' ) or
401 str_contains( $struct, '%post_id%' ) or
402 str_contains( $struct, '%pagename%' ) or
403 str_contains( $struct, '%year%' ) and
404 str_contains( $struct, '%monthnum%' ) and
405 str_contains( $struct, '%day%' ) and
406 str_contains( $struct, '%hour%' ) and
407 str_contains( $struct, '%minute%' ) and
408 str_contains( $struct, '%second%' )
409 ) {
410 $post = true;
411
412 if ( str_contains( $struct, '%pagename%' ) ) {
413 $page = true;
414 }
415 }
416
417 if ( ! $post ) {
418 foreach ( get_post_types( array( '_builtin' => false ) ) as $ptype ) {
419 if ( str_contains( $struct, "%$ptype%" ) ) {
420 $post = true;
421 $page = is_post_type_hierarchical( $ptype );
422 break;
423 }
424 }
425 }
426
427 if ( $post ) {
428 $trackbackmatch = $match . $trackbackregex;
429 $trackbackquery = $trackbackindex . '?' . $query . '&tb=1';
430
431 $embedmatch = $match . $embedregex;
432 $embedquery = $embedindex . '?' . $query . '&embed=true';
433
434 $match = rtrim( $match, '/' );
435 $submatchbase = preg_replace( '/\(([^?].+?)\)/', '(?:$1)', $match );
436
437 $sub1 = $submatchbase . '/([^/]+)/';
438 $sub1tb = $sub1 . $trackbackregex;
439 $sub1feed = $sub1 . $feedregex;
440 $sub1feed2 = $sub1 . $feedregex2;
441 $sub1comment = $sub1 . $commentregex;
442 $sub1embed = $sub1 . $embedregex;
443
444 $sub2 = $submatchbase . '/attachment/([^/]+)/';
445 $sub2tb = $sub2 . $trackbackregex;
446 $sub2feed = $sub2 . $feedregex;
447 $sub2feed2 = $sub2 . $feedregex2;
448 $sub2comment = $sub2 . $commentregex;
449 $sub2embed = $sub2 . $embedregex;
450
451 $subquery = $index . '?attachment=' . $wp_rewrite->preg_index( 1 );
452 $subtbquery = $subquery . '&tb=1';
453 $subfeedquery = $subquery . '&feed=' . $wp_rewrite->preg_index( 2 );
454 $subcommentquery = $subquery . '&cpage=' . $wp_rewrite->preg_index( 2 );
455 $subembedquery = $subquery . '&embed=true';
456
457 if ( ! empty( $args['endpoints'] ) ) {
458 foreach ( (array) $ep_query_append as $regex => $ep ) {
459 if ( $ep[0] & EP_ATTACHMENT ) {
460 $rewrite[$sub1 . $regex] =
461 $subquery . $ep[1] . $wp_rewrite->preg_index( 3 );
462 $rewrite[$sub2 . $regex] =
463 $subquery . $ep[1] . $wp_rewrite->preg_index( 3 );
464 }
465 }
466 }
467
468 $sub1 .= '?$';
469 $sub2 .= '?$';
470
471 $match = $match . '(?:/([0-9]+))?/?$';
472 $query = $index . '?' . $query
473 . '&page=' . $wp_rewrite->preg_index( $num_toks + 1 );
474 } else {
475 $match .= '?$';
476 $query = $index . '?' . $query;
477 }
478
479 $rewrite = array_merge( $rewrite, array( $match => $query ) );
480
481 if ( $post ) {
482 $rewrite = array_merge(
483 array( $trackbackmatch => $trackbackquery ),
484 $rewrite
485 );
486
487 $rewrite = array_merge(
488 array( $embedmatch => $embedquery ),
489 $rewrite
490 );
491
492 if ( ! $page ) {
493 $rewrite = array_merge(
494 $rewrite,
495 array(
496 $sub1 => $subquery,
497 $sub1tb => $subtbquery,
498 $sub1feed => $subfeedquery,
499 $sub1feed2 => $subfeedquery,
500 $sub1comment => $subcommentquery,
501 $sub1embed => $subembedquery,
502 )
503 );
504 }
505
506 $rewrite = array_merge(
507 array(
508 $sub2 => $subquery,
509 $sub2tb => $subtbquery,
510 $sub2feed => $subfeedquery,
511 $sub2feed2 => $subfeedquery,
512 $sub2comment => $subcommentquery,
513 $sub2embed => $subembedquery,
514 ),
515 $rewrite
516 );
517 }
518 }
519
520 $post_rewrite = array_merge( $rewrite, $post_rewrite );
521 }
522
523 return $post_rewrite;
524 }
525