]> _ Git - physioassist-wordpress.git/blob
772b14f8c80d3fd7ed29dc0449df2fc5d806eece
[physioassist-wordpress.git] /
1 <?php
2
3 class WPML_URL_Converter_Subdir_Strategy extends WPML_URL_Converter_Abstract_Strategy {
4         /** @var bool */
5         private $use_directory_for_default_lang;
6
7         /** @var array copy of $sitepress->get_settings( 'urls' ) */
8         private $urls_settings;
9
10         /** @var string|bool */
11         private $root_url;
12
13         /** @var array map of wpml codes to custom codes*/
14         private $language_codes_map;
15         private $language_codes_reverse_map;
16
17         /** @var bool */
18         private $is_rest_request;
19
20         /**
21          * @param bool   $use_directory_for_default_lang
22          * @param string $default_language
23          * @param array  $active_languages
24          * @param array  $urls_settings
25          */
26         public function __construct(
27                 $use_directory_for_default_lang,
28                 $default_language,
29                 $active_languages,
30                 $urls_settings
31         ) {
32                 parent::__construct( $default_language, $active_languages );
33                 $this->use_directory_for_default_lang = (bool) $use_directory_for_default_lang;
34                 $this->urls_settings                  = $urls_settings;
35
36                 $this->language_codes_map = array_combine( $active_languages, $active_languages );
37                 $this->language_codes_map = apply_filters( 'wpml_language_codes_map', $this->language_codes_map );
38
39                 $this->language_codes_reverse_map = array_flip( $this->language_codes_map );
40
41                 $this->add_hooks();
42         }
43
44         public function add_hooks() {
45                 add_filter( 'rest_url', [ $this, 'convertRestUrl' ] );
46         }
47
48         /**
49          * @param string $url
50          *
51          * @return string
52          */
53         public function convertRestUrl( $url ) {
54                 /** @var SitePress */
55                 global $sitepress;
56
57                 $matchTrailingSlash = $url[ strlen( $url ) - 1 ] === '/' ? 'trailingslashit' : 'untrailingslashit';
58
59                 return $matchTrailingSlash( $this->convert_url_string( $url, $sitepress->get_current_language() ) );
60         }
61
62         public function get_lang_from_url_string( $url ) {
63                 $url_path = $this->get_url_path( wpml_strip_subdir_from_url( $url ) );
64                 $lang     = $this->extract_lang_from_url_path( $url_path );
65
66                 if ( $lang && in_array( $lang, $this->active_languages, true ) ) {
67                         return $lang;
68                 }
69
70                 return $this->use_directory_for_default_lang ? null : $this->default_language;
71         }
72
73         public function validate_language( $language, $url ) {
74                 if ( ! ( null === $language && $this->use_directory_for_default_lang && ! $this->get_url_helper()->is_url_admin( $url ) ) ) {
75                         $language = parent::validate_language( $language, $url );
76                 }
77
78                 return $language;
79         }
80
81         public function convert_url_string( $source_url, $code ) {
82                 if ( $this->is_root_url( $source_url ) || $this->skip_convert_url_string( $source_url, $code ) ) {
83                         return $source_url;
84                 }
85
86                 $source_url = $this->filter_source_url( $source_url );
87
88                 $absolute_home_url = trailingslashit( preg_replace( '#^(http|https)://#', '', $this->get_url_helper()->get_abs_home() ) );
89                 $absolute_home_url = strpos( $source_url, $absolute_home_url ) === false ? trailingslashit( get_option( 'home' ) ) : $absolute_home_url;
90
91                 $current_language = $this->get_lang_from_url_string( $source_url );
92                 $code             = $this->get_language_of_current_dir( $code, '' );
93                 $current_language = $this->get_language_of_current_dir( $current_language, '' );
94
95                 $code             = isset( $this->language_codes_map[ $code ] ) ? $this->language_codes_map[ $code ] : $code;
96                 $current_language = isset( $this->language_codes_map[ $current_language ] ) ? $this->language_codes_map[ $current_language ] : $current_language;
97
98                 $source_url = str_replace(
99                         [
100                                 trailingslashit( $absolute_home_url . $current_language ),
101                                 '/' . $code . '//',
102                         ],
103                         [
104                                 $code ? ( $absolute_home_url . $code . '/' ) : trailingslashit( $absolute_home_url ),
105                                 '/' . $code . '/',
106                         ],
107                         $source_url
108                 );
109
110                 return $this->slash_helper->maybe_user_trailingslashit( $source_url );
111         }
112
113         public function convert_admin_url_string( $source_url, $lang ) {
114                 return $source_url; // Admin strings should not be converted with language in directories
115         }
116
117         /**
118          * @param string $url
119          * @param string $language
120          *
121          * @return string
122          */
123         public function get_home_url_relative( $url, $language ) {
124                 $language = $this->get_language_of_current_dir( $language, '' );
125                 $language = isset( $this->language_codes_map[ $language ] ) ? $this->language_codes_map[ $language ] : $language;
126
127                 if ( $language ) {
128                         $parts = parse_url( get_option( 'home' ) );
129                         $path  = isset( $parts['path'] ) ? $parts['path'] : '';
130                         $url   = preg_replace( '@^' . $path . '@', '', $url );
131
132                         return rtrim( $path, '/' ) . '/' . $language . $url;
133                 } else {
134                         return $url;
135                 }
136         }
137
138         public function use_wp_login_url_converter() {
139                 return true;
140         }
141
142         /**
143          * Will return true if root URL or child of root URL
144          *
145          * @param string $url
146          *
147          * @return bool
148          */
149         private function is_root_url( $url ) {
150                 $result = false;
151
152                 if ( isset( $this->urls_settings['root_page'], $this->urls_settings['show_on_root'] ) &&
153                          'page' === $this->urls_settings['show_on_root'] &&
154                         ! empty( $this->urls_settings['directory_for_default_language'] )
155                 ) {
156
157                         $root_url = $this->get_root_url();
158                         if ( $root_url ) {
159                                 $result = strpos( trailingslashit( $url ), $root_url ) === 0;
160                         }
161                 }
162
163                 return $result;
164         }
165
166         /**
167          * @return string|bool
168          */
169         private function get_root_url() {
170                 if ( null === $this->root_url ) {
171                         $root_post = get_post( $this->urls_settings['root_page'] );
172
173                         if ( $root_post ) {
174                                 $this->root_url = trailingslashit( $this->get_url_helper()->get_abs_home() ) . $root_post->post_name;
175                                 $this->root_url = trailingslashit( $this->root_url );
176                         } else {
177                                 $this->root_url = false;
178                         }
179                 }
180
181                 return $this->root_url;
182         }
183
184         /**
185          * @param string $source_url
186          *
187          * @return string
188          */
189         private function filter_source_url( $source_url ) {
190                 if ( false === strpos( $source_url, '?' ) ) {
191                         $source_url = trailingslashit( $source_url );
192                 } elseif ( false !== strpos( $source_url, '?' ) && false === strpos( $source_url, '/?' ) ) {
193                         $source_url = str_replace( '?', '/?', $source_url );
194                 }
195
196                 return $source_url;
197         }
198
199         /**
200          * @param string $url
201          *
202          * @return string
203          */
204         private function get_url_path( $url ) {
205                 if ( strpos( $url, 'http://' ) === 0 || strpos( $url, 'https://' ) === 0 ) {
206                         $url_path = wpml_parse_url( $url, PHP_URL_PATH );
207                 } else {
208                         $pathparts = array_filter( explode( '/', $url ) );
209                         if ( count( $pathparts ) > 1 ) {
210                                 unset( $pathparts[0] );
211                                 $url_path = implode( '/', $pathparts );
212                         } else {
213                                 $url_path = $url;
214                         }
215                 }
216
217                 return $url_path;
218         }
219
220         /**
221          * @param string $url_path
222          *
223          * @return string
224          */
225         private function extract_lang_from_url_path( $url_path ) {
226                 $fragments = array_filter( (array) explode( '/', $url_path ) );
227                 $lang      = array_shift( $fragments );
228
229                 $lang_get_parts = explode( '?', $lang );
230                 $lang           = $lang_get_parts[0];
231
232                 return isset( $this->language_codes_reverse_map[ $lang ] ) ? $this->language_codes_reverse_map[ $lang ] : $lang;
233         }
234
235         /**
236          * @param string      $language_code
237          * @param null|string $value_if_default_language
238          *
239          * @return string|null
240          */
241         private function get_language_of_current_dir( $language_code, $value_if_default_language = null ) {
242                 if ( ! $this->use_directory_for_default_lang && $language_code === $this->default_language ) {
243                         return $value_if_default_language;
244                 }
245
246                 return $language_code;
247         }
248
249 }