PluginProbe
Bogo / 2.7
Bogo v2.7
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 2.7, at includes/rewrite.php

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