| @@ -2,23 +2,19 @@ | ||
| 2 | 2 | |
| 3 | 3 | add_action( 'init', 'bogo_add_rewrite_tags' ); |
| 4 | 4 | |
| 5 | 5 | function bogo_add_rewrite_tags() { |
| 6 | - $langs = array_keys( bogo_available_languages() ); | |
| 7 | - $langs = array_map( 'bogo_lang_slug', $langs ); | |
| 8 | - $langs = array_filter( $langs ); | |
| 6 | + $regex = bogo_get_lang_regex(); | |
| 9 | 7 | |
| 10 | - if ( empty( $langs ) ) | |
| 8 | + if ( empty( $regex ) ) | |
| 11 | 9 | return; |
| 12 | 10 | |
| 13 | - $lang_rewrite_regex = '(' . implode( '|', $langs ) . ')'; | |
| 11 | + add_rewrite_tag( '%lang%', $regex, 'lang=' ); | |
| 14 | 12 | |
| 15 | - add_rewrite_tag( '%lang%', $lang_rewrite_regex, 'lang=' ); | |
| 16 | - | |
| 17 | 13 | $old_regex = bogo_get_prop( 'lang_rewrite_regex' ); |
| 18 | 14 | |
| 19 | - if ( $lang_rewrite_regex != $old_regex ) { | |
| 20 | - bogo_set_prop( 'lang_rewrite_regex', $lang_rewrite_regex ); | |
| 15 | + if ( $regex != $old_regex ) { | |
| 16 | + bogo_set_prop( 'lang_rewrite_regex', $regex ); | |
| 21 | 17 | flush_rewrite_rules(); |
| 22 | 18 | } |
| 23 | 19 | } |
| 24 | 20 | |
| @@ -41,15 +37,25 @@ | ||
| 41 | 37 | global $wp_rewrite; |
| 42 | 38 | |
| 43 | 39 | $permastruct = $wp_rewrite->permalink_structure; |
| 44 | 40 | |
| 45 | - if ( ! apache_mod_loaded( 'mod_rewrite', true ) && ! iis7_supports_permalinks() ) | |
| 46 | - $permastruct = preg_replace( '#^/index\.php#', '/index.php/%lang%', $permastruct ); | |
| 47 | - elseif ( is_multisite() && ! is_subdomain_install() && is_main_site() ) | |
| 48 | - $permastruct = preg_replace( '#^/blog#', '/%lang%/blog', $permastruct ); | |
| 49 | - else | |
| 50 | - $permastruct = preg_replace( '#^/#', '/%lang%/', $permastruct ); | |
| 41 | + // from wp-admin/includes/misc.php | |
| 42 | + $got_rewrite = apply_filters( 'got_rewrite', | |
| 43 | + apache_mod_loaded( 'mod_rewrite', true ) ); | |
| 44 | + $got_url_rewrite = apply_filters( 'got_url_rewrite', | |
| 45 | + $got_rewrite || $GLOBALS['is_nginx'] || iis7_supports_permalinks() ); | |
| 51 | 46 | |
| 47 | + if ( ! $got_url_rewrite ) { | |
| 48 | + $permastruct = preg_replace( | |
| 49 | + '#^/index\.php#', '/index.php/%lang%', $permastruct ); | |
| 50 | + } elseif ( is_multisite() && ! is_subdomain_install() && is_main_site() ) { | |
| 51 | + $permastruct = preg_replace( | |
| 52 | + '#^/blog#', '/%lang%/blog', $permastruct ); | |
| 53 | + } else { | |
| 54 | + $permastruct = preg_replace( | |
| 55 | + '#^/#', '/%lang%/', $permastruct ); | |
| 56 | + } | |
| 57 | + | |
| 52 | 58 | $extra = bogo_generate_rewrite_rules( $permastruct, array( |
| 53 | 59 | 'ep_mask' => EP_PERMALINK, |
| 54 | 60 | 'paged' => false ) ); |
| 55 | 61 | |
| @@ -167,8 +173,114 @@ | ||
| 167 | 173 | $extra = bogo_generate_rewrite_rules( $permastruct, array( |
| 168 | 174 | 'ep_mask' => $ep_mask ) ); |
| 169 | 175 | |
| 170 | 176 | return array_merge( $extra, $taxonomy_rewrite ); |
| 177 | +} | |
| 178 | + | |
| 179 | +add_filter( 'rewrite_rules_array', 'bogo_rewrite_rules_array' ); | |
| 180 | + | |
| 181 | +function bogo_rewrite_rules_array( $rules ) { | |
| 182 | + global $wp_rewrite; | |
| 183 | + | |
| 184 | + $post_types = array_diff( | |
| 185 | + (array) bogo_localizable_post_types(), | |
| 186 | + get_post_types( array( '_builtin' => true ) ) ); | |
| 187 | + | |
| 188 | + if ( empty( $post_types ) ) | |
| 189 | + return $rules; | |
| 190 | + | |
| 191 | + $lang_regex = bogo_get_lang_regex(); | |
| 192 | + | |
| 193 | + foreach ( $post_types as $post_type ) { | |
| 194 | + if ( ! $post_type_obj = get_post_type_object( $post_type ) ) | |
| 195 | + continue; | |
| 196 | + | |
| 197 | + if ( false === $post_type_obj->rewrite ) | |
| 198 | + continue; | |
| 199 | + | |
| 200 | + $permastruct = $wp_rewrite->get_extra_permastruct( $post_type ); | |
| 201 | + | |
| 202 | + if ( $post_type_obj->rewrite['with_front'] ) { | |
| 203 | + $permastruct = preg_replace( | |
| 204 | + '#^' . $wp_rewrite->front . '#', | |
| 205 | + '/%lang%' . $wp_rewrite->front, | |
| 206 | + $permastruct ); | |
| 207 | + } else { | |
| 208 | + $permastruct = preg_replace( | |
| 209 | + '#^' . $wp_rewrite->root . '#', | |
| 210 | + '/%lang%/' . $wp_rewrite->root, | |
| 211 | + $permastruct ); | |
| 212 | + } | |
| 213 | + | |
| 214 | + $rules = array_merge( | |
| 215 | + bogo_generate_rewrite_rules( $permastruct, $post_type_obj->rewrite ), | |
| 216 | + $rules ); | |
| 217 | + | |
| 218 | + if ( $post_type_obj->has_archive ) { | |
| 219 | + if ( $post_type_obj->has_archive === true ) | |
| 220 | + $archive_slug = $post_type_obj->rewrite['slug']; | |
| 221 | + else | |
| 222 | + $archive_slug = $post_type_obj->has_archive; | |
| 223 | + | |
| 224 | + if ( $post_type_obj->rewrite['with_front'] ) | |
| 225 | + $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; | |
| 226 | + else | |
| 227 | + $archive_slug = $wp_rewrite->root . $archive_slug; | |
| 228 | + | |
| 229 | + $extra_rules = array( | |
| 230 | + "{$lang_regex}/{$archive_slug}/?$" | |
| 231 | + => 'index.php?lang=$matches[1]&post_type=' . $post_type ); | |
| 232 | + | |
| 233 | + $rules = $extra_rules + $rules; | |
| 234 | + | |
| 235 | + if ( $post_type_obj->rewrite['feeds'] && $wp_rewrite->feeds ) { | |
| 236 | + $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; | |
| 237 | + | |
| 238 | + $extra_rules = array( | |
| 239 | + "{$lang_regex}/{$archive_slug}/feed/$feeds/?$" | |
| 240 | + => 'index.php?lang=$matches[1]&post_type=' . $post_type . '&feed=$matches[2]', | |
| 241 | + "{$lang_regex}/{$archive_slug}/$feeds/?$" | |
| 242 | + => 'index.php?lang=$matches[1]&post_type=' . $post_type . '&feed=$matches[2]' ); | |
| 243 | + | |
| 244 | + $rules = $extra_rules + $rules; | |
| 245 | + } | |
| 246 | + | |
| 247 | + if ( $post_type_obj->rewrite['pages'] ) { | |
| 248 | + $extra_rules = array( | |
| 249 | + "{$lang_regex}/{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$" => 'index.php?lang=$matches[1]&post_type=' . $post_type . '&paged=$matches[2]' ); | |
| 250 | + | |
| 251 | + $rules = $extra_rules + $rules; | |
| 252 | + } | |
| 253 | + } | |
| 254 | + | |
| 255 | + foreach ( get_object_taxonomies( $post_type ) as $tax ) { | |
| 256 | + if ( ! $tax_obj = get_taxonomy( $tax ) ) | |
| 257 | + continue; | |
| 258 | + | |
| 259 | + if ( false === $tax_obj->rewrite ) | |
| 260 | + continue; | |
| 261 | + | |
| 262 | + $permastruct = $wp_rewrite->get_extra_permastruct( $tax ); | |
| 263 | + | |
| 264 | + if ( $tax_obj->rewrite['with_front'] ) { | |
| 265 | + $permastruct = preg_replace( | |
| 266 | + '#^' . $wp_rewrite->front . '#', | |
| 267 | + '/%lang%' . $wp_rewrite->front, | |
| 268 | + $permastruct ); | |
| 269 | + } else { | |
| 270 | + $permastruct = preg_replace( | |
| 271 | + '#^' . $wp_rewrite->root . '#', | |
| 272 | + '/%lang%/' . $wp_rewrite->root, | |
| 273 | + $permastruct ); | |
| 274 | + } | |
| 275 | + | |
| 276 | + $rules = array_merge( | |
| 277 | + bogo_generate_rewrite_rules( $permastruct, $tax_obj->rewrite ), | |
| 278 | + $rules ); | |
| 279 | + } | |
| 280 | + } | |
| 281 | + | |
| 282 | + return $rules; | |
| 171 | 283 | } |
| 172 | 284 | |
| 173 | 285 | function bogo_generate_rewrite_rules( $permalink_structure, $args = '' ) { |
| 174 | 286 | global $wp_rewrite; |