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

558 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 $rest_url_prefix = rest_get_url_prefix();
189
190 $extra_rules = array(
191 "^{$lang_regex}/{$rest_url_prefix}/?$"
192 => 'index.php?lang=$matches[1]&rest_route=/',
193 "^{$lang_regex}/{$rest_url_prefix}/(.*)?"
194 => 'index.php?lang=$matches[1]&rest_route=/$matches[2]' );
195
196 $rules = $extra_rules + $rules;
197
198 $post_types = array_diff(
199 (array) bogo_localizable_post_types(),
200 get_post_types( array( '_builtin' => true ) ) );
201
202 if ( empty( $post_types ) ) {
203 return $rules;
204 }
205
206 foreach ( $post_types as $post_type ) {
207 if ( ! $post_type_obj = get_post_type_object( $post_type ) )
208 continue;
209
210 if ( false === $post_type_obj->rewrite )
211 continue;
212
213 $permastruct = $wp_rewrite->get_extra_permastruct( $post_type );
214
215 if ( $post_type_obj->rewrite['with_front'] ) {
216 $permastruct = preg_replace(
217 '#^' . $wp_rewrite->front . '#',
218 '/%lang%' . $wp_rewrite->front,
219 $permastruct );
220 } else {
221 $permastruct = preg_replace(
222 '#^' . $wp_rewrite->root . '#',
223 '/%lang%/' . $wp_rewrite->root,
224 $permastruct );
225 }
226
227 $rules = array_merge(
228 bogo_generate_rewrite_rules( $permastruct, $post_type_obj->rewrite ),
229 $rules );
230
231 if ( $post_type_obj->has_archive ) {
232 if ( $post_type_obj->has_archive === true )
233 $archive_slug = $post_type_obj->rewrite['slug'];
234 else
235 $archive_slug = $post_type_obj->has_archive;
236
237 if ( $post_type_obj->rewrite['with_front'] )
238 $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug;
239 else
240 $archive_slug = $wp_rewrite->root . $archive_slug;
241
242 $extra_rules = array(
243 "{$lang_regex}/{$archive_slug}/?$"
244 => 'index.php?lang=$matches[1]&post_type=' . $post_type );
245
246 $rules = $extra_rules + $rules;
247
248 if ( $post_type_obj->rewrite['feeds'] && $wp_rewrite->feeds ) {
249 $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')';
250
251 $extra_rules = array(
252 "{$lang_regex}/{$archive_slug}/feed/$feeds/?$"
253 => 'index.php?lang=$matches[1]&post_type=' . $post_type . '&feed=$matches[2]',
254 "{$lang_regex}/{$archive_slug}/$feeds/?$"
255 => 'index.php?lang=$matches[1]&post_type=' . $post_type . '&feed=$matches[2]' );
256
257 $rules = $extra_rules + $rules;
258 }
259
260 if ( $post_type_obj->rewrite['pages'] ) {
261 $extra_rules = array(
262 "{$lang_regex}/{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$" => 'index.php?lang=$matches[1]&post_type=' . $post_type . '&paged=$matches[2]' );
263
264 $rules = $extra_rules + $rules;
265 }
266 }
267
268 foreach ( get_object_taxonomies( $post_type ) as $tax ) {
269 if ( ! $tax_obj = get_taxonomy( $tax ) )
270 continue;
271
272 if ( false === $tax_obj->rewrite )
273 continue;
274
275 $permastruct = $wp_rewrite->get_extra_permastruct( $tax );
276
277 if ( $tax_obj->rewrite['with_front'] ) {
278 $permastruct = preg_replace(
279 '#^' . $wp_rewrite->front . '#',
280 '/%lang%' . $wp_rewrite->front,
281 $permastruct );
282 } else {
283 $permastruct = preg_replace(
284 '#^' . $wp_rewrite->root . '#',
285 '/%lang%/' . $wp_rewrite->root,
286 $permastruct );
287 }
288
289 $rules = array_merge(
290 bogo_generate_rewrite_rules( $permastruct, $tax_obj->rewrite ),
291 $rules );
292 }
293 }
294
295 return $rules;
296 }
297
298 function bogo_generate_rewrite_rules( $permalink_structure, $args = '' ) {
299 global $wp_rewrite;
300
301 $defaults = array(
302 'ep_mask' => EP_NONE,
303 'paged' => true,
304 'feed' => true,
305 'forcomments' => false,
306 'walk_dirs' => true,
307 'endpoints' => true );
308
309 $args = wp_parse_args( $args, $defaults );
310
311 extract( $args, EXTR_SKIP );
312
313 $feedregex2 = '(' . implode( '|', $wp_rewrite->feeds ) . ')/?$';
314 $feedregex = $wp_rewrite->feed_base . '/' . $feedregex2;
315 $trackbackregex = 'trackback/?$';
316 $pageregex = $wp_rewrite->pagination_base . '/?([0-9]{1,})/?$';
317 $commentregex = 'comment-page-([0-9]{1,})/?$';
318 $embedregex = 'embed/?$';
319
320 if ( $endpoints ) {
321 $ep_query_append = array();
322
323 foreach ( (array) $wp_rewrite->endpoints as $endpoint ) {
324 $epmatch = $endpoint[1] . '(/(.*))?/?$';
325 $epquery = '&' . $endpoint[1] . '=';
326 $ep_query_append[$epmatch] = array( $endpoint[0], $epquery );
327 }
328 }
329
330 $front = substr( $permalink_structure, 0, strpos( $permalink_structure, '%' ) );
331 preg_match_all( '/%.+?%/', $permalink_structure, $tokens );
332 $num_tokens = count( $tokens[0] );
333 $index = $wp_rewrite->index;
334 $feedindex = $index;
335 $trackbackindex = $index;
336 $embedindex = $index;
337
338 for ( $i = 0; $i < $num_tokens; ++$i ) {
339 if ( 0 < $i ) {
340 $queries[$i] = $queries[$i - 1] . '&';
341 } else {
342 $queries[$i] = '';
343 }
344
345 $query_token =
346 str_replace( $wp_rewrite->rewritecode, $wp_rewrite->queryreplace, $tokens[0][$i] )
347 . $wp_rewrite->preg_index( $i + 1 );
348
349 $queries[$i] .= $query_token;
350 }
351
352 $structure = $permalink_structure;
353
354 if ( $front != '/' ) {
355 $structure = str_replace( $front, '', $structure );
356 }
357
358 $structure = trim( $structure, '/' );
359
360 $dirs = $walk_dirs ? explode( '/', $structure ) : array( $structure );
361 $num_dirs = count( $dirs );
362
363 $front = preg_replace( '|^/+|', '', $front );
364
365 $post_rewrite = array();
366 $struct = $front;
367
368 for ( $j = 0; $j < $num_dirs; ++$j ) {
369 $struct .= $dirs[$j] . '/';
370 $struct = ltrim( $struct, '/' );
371 $match = str_replace( $wp_rewrite->rewritecode, $wp_rewrite->rewritereplace, $struct);
372 $num_toks = preg_match_all( '/%.+?%/', $struct, $toks );
373
374 $query = ( isset( $queries ) && is_array( $queries ) && ! empty( $num_toks ) )
375 ? $queries[$num_toks - 1] : '';
376
377 switch ( $dirs[$j] ) {
378 case '%year%':
379 $ep_mask_specific = EP_YEAR;
380 break;
381 case '%monthnum%':
382 $ep_mask_specific = EP_MONTH;
383 break;
384 case '%day%':
385 $ep_mask_specific = EP_DAY;
386 break;
387 default:
388 $ep_mask_specific = EP_NONE;
389 }
390
391 $pagematch = $match . $pageregex;
392 $pagequery = $index . '?' . $query
393 . '&paged=' . $wp_rewrite->preg_index( $num_toks + 1 );
394
395 $commentmatch = $match . $commentregex;
396 $commentquery = $index . '?' . $query
397 . '&cpage=' . $wp_rewrite->preg_index( $num_toks + 1 );
398
399 if ( get_option( 'page_on_front' ) ) {
400 $rootcommentmatch = $match . $commentregex;
401 $rootcommentquery = $index . '?' . $query
402 . '&page_id=' . get_option( 'page_on_front' )
403 . '&cpage=' . $wp_rewrite->preg_index( $num_toks + 1 );
404 }
405
406 $feedmatch = $match . $feedregex;
407 $feedquery = $feedindex . '?' . $query
408 . '&feed=' . $wp_rewrite->preg_index( $num_toks + 1 );
409
410 $feedmatch2 = $match . $feedregex2;
411 $feedquery2 = $feedindex . '?' . $query
412 . '&feed=' . $wp_rewrite->preg_index( $num_toks + 1 );
413
414 if ( $forcomments ) {
415 $feedquery .= '&withcomments=1';
416 $feedquery2 .= '&withcomments=1';
417 }
418
419 $rewrite = array();
420
421 if ( $feed ) {
422 $rewrite = array( $feedmatch => $feedquery, $feedmatch2 => $feedquery2 );
423 }
424
425 if ( $paged ) {
426 $rewrite = array_merge( $rewrite, array( $pagematch => $pagequery ) );
427 }
428
429 if ( EP_PAGES & $ep_mask || EP_PERMALINK & $ep_mask ) {
430 $rewrite = array_merge( $rewrite, array( $commentmatch => $commentquery ) );
431 } elseif ( EP_ROOT & $ep_mask && get_option( 'page_on_front' ) ) {
432 $rewrite = array_merge( $rewrite, array( $rootcommentmatch => $rootcommentquery ) );
433 }
434
435 if ( $endpoints ) {
436 foreach ( (array) $ep_query_append as $regex => $ep ) {
437 if ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific ) {
438 $rewrite[$match . $regex] = $index . '?' . $query
439 . $ep[1] . $wp_rewrite->preg_index( $num_toks + 2 );
440 }
441 }
442 }
443
444 if ( $num_toks ) {
445 $post = false;
446 $page = false;
447
448 if ( strpos( $struct, '%postname%' ) !== false
449 || strpos( $struct, '%post_id%' ) !== false
450 || strpos( $struct, '%pagename%' ) !== false
451 || ( strpos( $struct, '%year%' ) !== false
452 && strpos( $struct, '%monthnum%' ) !== false
453 && strpos( $struct, '%day%' ) !== false
454 && strpos( $struct, '%hour%' ) !== false
455 && strpos( $struct, '%minute%' ) !== false
456 && strpos( $struct, '%second%' ) !== false ) ) {
457 $post = true;
458
459 if ( strpos( $struct, '%pagename%' ) !== false ) {
460 $page = true;
461 }
462 }
463
464 if ( ! $post ) {
465 foreach ( get_post_types( array( '_builtin' => false ) ) as $ptype ) {
466 if ( strpos( $struct, "%$ptype%" ) !== false ) {
467 $post = true;
468 $page = is_post_type_hierarchical( $ptype );
469 break;
470 }
471 }
472 }
473
474 if ( $post ) {
475 $trackbackmatch = $match . $trackbackregex;
476 $trackbackquery = $trackbackindex . '?' . $query . '&tb=1';
477
478 $embedmatch = $match . $embedregex;
479 $embedquery = $embedindex . '?' . $query . '&embed=true';
480
481 $match = rtrim( $match, '/' );
482 $submatchbase = preg_replace( '/\(([^?].+?)\)/', '(?:$1)', $match );
483
484 $sub1 = $submatchbase . '/([^/]+)/';
485 $sub1tb = $sub1 . $trackbackregex;
486 $sub1feed = $sub1 . $feedregex;
487 $sub1feed2 = $sub1 . $feedregex2;
488 $sub1comment = $sub1 . $commentregex;
489 $sub1embed = $sub1 . $embedregex;
490
491 $sub2 = $submatchbase . '/attachment/([^/]+)/';
492 $sub2tb = $sub2 . $trackbackregex;
493 $sub2feed = $sub2 . $feedregex;
494 $sub2feed2 = $sub2 . $feedregex2;
495 $sub2comment = $sub2 . $commentregex;
496 $sub2embed = $sub2 . $embedregex;
497
498 $subquery = $index . '?attachment=' . $wp_rewrite->preg_index( 1 );
499 $subtbquery = $subquery . '&tb=1';
500 $subfeedquery = $subquery . '&feed=' . $wp_rewrite->preg_index( 2 );
501 $subcommentquery = $subquery . '&cpage=' . $wp_rewrite->preg_index( 2 );
502 $subembedquery = $subquery . '&embed=true';
503
504 if ( ! empty( $endpoints ) ) {
505 foreach ( (array) $ep_query_append as $regex => $ep ) {
506 if ( $ep[0] & EP_ATTACHMENT ) {
507 $rewrite[$sub1 . $regex] =
508 $subquery . $ep[1] . $wp_rewrite->preg_index( 2 );
509 $rewrite[$sub2 . $regex] =
510 $subquery . $ep[1] . $wp_rewrite->preg_index( 2 );
511 }
512 }
513 }
514
515 $sub1 .= '?$';
516 $sub2 .= '?$';
517
518 $match = $match . '(/[0-9]+)?/?$';
519 $query = $index . '?' . $query
520 . '&page=' . $wp_rewrite->preg_index( $num_toks + 1 );
521 } else {
522 $match .= '?$';
523 $query = $index . '?' . $query;
524 }
525
526 $rewrite = array_merge( $rewrite, array( $match => $query ) );
527
528 if ( $post ) {
529 $rewrite = array_merge( array( $trackbackmatch => $trackbackquery ), $rewrite );
530
531 $rewrite = array_merge( array( $embedmatch => $embedquery ), $rewrite );
532
533 if ( ! $page ) {
534 $rewrite = array_merge( $rewrite, array(
535 $sub1 => $subquery,
536 $sub1tb => $subtbquery,
537 $sub1feed => $subfeedquery,
538 $sub1feed2 => $subfeedquery,
539 $sub1comment => $subcommentquery,
540 $sub1embed => $subembedquery ) );
541 }
542
543 $rewrite = array_merge( array(
544 $sub2 => $subquery,
545 $sub2tb => $subtbquery,
546 $sub2feed => $subfeedquery,
547 $sub2feed2 => $subfeedquery,
548 $sub2comment => $subcommentquery,
549 $sub2embed => $subembedquery ), $rewrite );
550 }
551 }
552
553 $post_rewrite = array_merge( $rewrite, $post_rewrite );
554 }
555
556 return $post_rewrite;
557 }
558