PluginProbe
Polylang / 1.5
Polylang v1.5
3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 3.0.3 All 233 releases
polylang / include / links-directory.php

links-directory.php in Polylang 1.5, at include/links-directory.php

218 lines 7.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /*
4 * links model for use when the language code is added in url as a directory
5 * for example mysite.com/en/something
6 * implements the "links_model interface"
7 *
8 * @since 1.2
9 */
10 class PLL_Links_Directory extends PLL_Links_Model {
11 protected $index = 'index.php'; // need this before $wp_rewrite is created, also harcoded in wp-includes/rewrite.php
12 protected $root;
13 protected $rewrite_rules = array();
14 protected $always_rewrite = array('date', 'root', 'comments', 'search', 'author', 'post_format', 'language');
15
16 /*
17 * constructor
18 *
19 * @since 1.2
20 *
21 * @param object $model PLL_Model instance
22 */
23 public function __construct(&$model) {
24 parent::__construct($model);
25
26 // inspired by wp-includes/rewrite.php
27 $this->root = preg_match('#^/*' . $this->index . '#', get_option('permalink_structure')) ? $this->index . '/' : '';
28
29 add_action ('setup_theme', array(&$this, 'add_permastruct'));
30
31 // refresh rewrite rules if the 'page_on_front' option is modified
32 add_action('update_option_page_on_front', 'flush_rewrite_rules');
33
34 // make sure to prepare rewrite rules when flushing
35 add_action ('pre_option_rewrite_rules', array(&$this, 'prepare_rewrite_rules'));
36 }
37
38 /*
39 * adds the language code in url
40 * links_model interface
41 *
42 * @since 1.2
43 *
44 * @param string $url url to modify
45 * @param object $lang language
46 * @return string modified url
47 */
48 public function add_language_to_link($url, $lang) {
49 if (!empty($lang)) {
50 $base = $this->options['rewrite'] ? '' : 'language/';
51 $slug = $this->options['default_lang'] == $lang->slug && $this->options['hide_default'] ? '' : $base . $lang->slug . '/';
52 return str_replace($this->home . '/' . $this->root, $this->home . '/' . $this->root . $slug, $url);
53 }
54 return $url;
55 }
56
57 /*
58 * returns the url without language code
59 * links_model interface
60 *
61 * @since 1.2
62 *
63 * @param string $url url to modify
64 * @return string modified url
65 */
66 function remove_language_from_link($url) {
67 foreach ($this->model->get_languages_list() as $language)
68 if (!$this->options['hide_default'] || $this->options['default_lang'] != $language->slug)
69 $languages[] = $language->slug;
70
71 if (!empty($languages)) {
72 $pattern = str_replace('/', '\/', $this->home . '/' . $this->root);
73 $pattern = '#' . $pattern . ($this->options['rewrite'] ? '' : 'language') . '('.implode('|', $languages).')(\/|$)#';
74 $url = preg_replace($pattern, $this->home . '/' . $this->root, $url);
75 }
76 return $url;
77 }
78
79 /*
80 * returns the language based on language code in url
81 * links_model interface
82 *
83 * @since 1.2
84 *
85 * @return string language slug
86 */
87 public function get_language_from_url() {
88 $requested_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
89 $pattern = str_replace('/', '\/', $this->home . '/' . $this->root . ($this->options['rewrite'] ? '' : 'language/'));
90 $pattern = '#' . $pattern . '('. implode('|', $this->model->get_languages_list(array('fields' => 'slug'))) . ')(\/|$)#';
91 return preg_match($pattern, trailingslashit($requested_url), $matches) ? $matches[1] : ''; // $matches[1] is the slug of the requested language
92 }
93
94 /*
95 * returns the home url
96 * links_model interface
97 *
98 * @since 1.3.1
99 *
100 * @param object $lang PLL_Language object
101 * @return string
102 */
103 public function home_url($lang) {
104 return $this->options['hide_default'] && $lang->slug == $this->options['default_lang'] ? $this->home : get_term_link($lang, 'language');
105 }
106
107 /*
108 * optionaly removes 'language' in permalinks so that we get http://www.myblog/en/ instead of http://www.myblog/language/en/
109 *
110 * @since 1.2
111 */
112 function add_permastruct() {
113 // language information always in front of the uri ('with_front' => false)
114 // the 3rd parameter structure has been modified in WP 3.4
115 add_permastruct('language', $this->options['rewrite'] ? '%language%' : 'language/%language%', array('with_front' => false));
116 }
117
118 /*
119 * prepares rewrite rules filters
120 *
121 * @since 0.8.1
122 *
123 * @param array $pre not used
124 * @return unmodified $pre
125 */
126 public function prepare_rewrite_rules($pre) {
127 //clean filters which could have been set in a previous call (may occur when changing Polylang settings)
128 foreach ($this->rewrite_rules as $type)
129 remove_filter($type . '_rewrite_rules', array(&$this, 'rewrite_rules'));
130
131 // don't modify the rules if there is no languages created yet
132 if ($this->model->get_languages_list()) {
133 // make sure we have the right post types and taxonomies
134 $types = array_values(array_merge($this->model->get_translated_post_types(), $this->model->get_translated_taxonomies()));
135 $types = array_merge($this->always_rewrite, $types);
136 $this->rewrite_rules = apply_filters('pll_rewrite_rules', $types); // allow plugins to add rewrite rules to the language filter
137
138 foreach ($this->rewrite_rules as $type)
139 add_filter($type . '_rewrite_rules', array(&$this, 'rewrite_rules'));
140
141 add_filter('rewrite_rules_array', array(&$this, 'rewrite_rules')); // needed for post type archives
142 }
143 return $pre;
144 }
145
146 /*
147 * the rewrite rules !
148 * always make sure the default language is at the end in case the language information is hidden for default language
149 * thanks to brbrbr http://wordpress.org/support/topic/plugin-polylang-rewrite-rules-not-correct
150 *
151 * @since 0.8.1
152 *
153 * @param array $rules rewrite rules
154 * @return array modified rewrite rules
155 */
156 public function rewrite_rules($rules) {
157 $filter = str_replace('_rewrite_rules', '', current_filter());
158
159 // suppress the rules created by WordPress for our taxonomy
160 if ($filter == 'language')
161 return array();
162
163 global $wp_rewrite;
164 $newrules = array();
165
166 $languages = $this->model->get_languages_list(array('fields' => 'slug'));
167 if ($this->options['hide_default'])
168 $languages = array_diff($languages, array($this->options['default_lang']));
169
170 if (!empty($languages))
171 $slug = $wp_rewrite->root . ($this->options['rewrite'] ? '' : 'language/') . '('.implode('|', $languages).')/';
172
173 // for custom post type archives
174 $cpts = array_intersect($this->model->get_translated_post_types(), get_post_types(array('_builtin' => false)));
175 $cpts = $cpts ? '#post_type=('.implode('|', $cpts).')#' : '';
176
177 foreach ($rules as $key => $rule) {
178 // we don't need the lang parameter for post types and taxonomies
179 // moreover adding it would create issues for pages and taxonomies
180 if ($this->options['force_lang'] && in_array($filter, array_merge($this->model->get_translated_post_types(), $this->model->get_translated_taxonomies()))) {
181 if (isset($slug))
182 $newrules[$slug.str_replace($wp_rewrite->root, '', $key)] = str_replace(
183 array('[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '[1]'),
184 array('[9]', '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]'),
185 $rule
186 ); // hopefully it is sufficient!
187
188 if ($this->options['hide_default']) {
189 $newrules[$key] = $rules[$key];
190 // unset only if we hide the code for the default language as check_language_code_in_url will do its job in other cases
191 unset($rules[$key]);
192 }
193 }
194
195 // rewrite rules filtered by language
196 elseif (in_array($filter, $this->always_rewrite) || ($cpts && preg_match($cpts, $rule) && !strpos($rule, 'name=')) || ($filter != 'rewrite_rules_array' && $this->options['force_lang'])) {
197 if (isset($slug))
198 $newrules[$slug.str_replace($wp_rewrite->root, '', $key)] = str_replace(
199 array('[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '[1]', '?'),
200 array('[9]', '[8]', '[7]', '[6]', '[5]', '[4]', '[3]', '[2]', '?lang=$matches[1]&'),
201 $rule
202 ); // should be enough!
203
204 if ($this->options['hide_default'])
205 $newrules[$key] = str_replace('?', '?lang='.$this->options['default_lang'].'&', $rule);
206
207 unset($rules[$key]); // now useless
208 }
209 }
210
211 // the home rewrite rule
212 if ($filter == 'root' && isset($slug))
213 $newrules[$slug.'?$'] = $wp_rewrite->index.'?lang=$matches[1]';
214
215 return $newrules + $rules;
216 }
217 }
218