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

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