]> _ Git - physioassist-wordpress.git/blob
434c2fc7c75d553cdd4687cddddd3ad852697ca0
[physioassist-wordpress.git] /
1 <?php
2
3 class WPML_URL_Converter_Subdir_Strategy extends WPML_URL_Converter_Abstract_Strategy {
4         /** @var string */
5         private $dir_default;
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         /**
18          * @param string $dir_default
19          * @param string $default_language
20          * @param array  $active_languages
21          * @param array  $urls_settings
22          */
23         public function __construct(
24                 $dir_default,
25                 $default_language,
26                 $active_languages,
27                 $urls_settings
28         ) {
29                 parent::__construct( $default_language, $active_languages );
30                 $this->dir_default   = $dir_default;
31                 $this->urls_settings = $urls_settings;
32
33                 $this->language_codes_map = array_combine( $active_languages, $active_languages );
34                 $this->language_codes_map = apply_filters( 'wpml_language_codes_map', $this->language_codes_map );
35
36                 $this->language_codes_reverse_map = array_flip( $this->language_codes_map );
37         }
38
39         public function get_lang_from_url_string( $url ) {
40
41                 $url = wpml_strip_subdir_from_url( $url );
42
43                 if ( strpos( $url, 'http://' ) === 0 || strpos( $url, 'https://' ) === 0 ) {
44                         $url_path = wpml_parse_url( $url, PHP_URL_PATH );
45                 } else {
46                         $pathparts = array_filter( explode( '/', $url ) );
47                         if ( count( $pathparts ) > 1 ) {
48                                 unset( $pathparts[0] );
49                                 $url_path = implode( '/', $pathparts );
50                         } else {
51                                 $url_path = $url;
52                         }
53                 }
54
55                 $fragments = array_filter( (array) explode( '/', $url_path ) );
56                 $lang      = array_shift( $fragments );
57
58                 $lang_get_parts = explode( '?', $lang );
59                 $lang = $lang_get_parts[0];
60
61                 $lang           = isset( $this->language_codes_reverse_map[ $lang ] ) ? $this->language_codes_reverse_map[ $lang ] : $lang;
62
63                 if ( $lang && in_array( $lang, $this->active_languages, true ) ) {
64                         return $lang;
65                 }
66                 return $this->dir_default ? null : $this->default_language;
67         }
68
69         public function validate_language( $language, $url ) {
70                 if ( ! ( null === $language && $this->dir_default && ! $this->get_url_helper()->is_url_admin( $url ) ) ) {
71                         $language = parent::validate_language( $language, $url );
72                 }
73
74                 return $language;
75         }
76
77         public function convert_url_string( $source_url, $code ) {
78                 if ( ! $this->is_root_url( $source_url ) ) {
79                         $source_url = $this->filter_source_url( $source_url );
80
81                         $absolute_home_url = trailingslashit( preg_replace( '#^(http|https)://#', '', $this->get_url_helper()->get_abs_home() ) );
82                         $absolute_home_url = strpos( $source_url, $absolute_home_url ) === false ? trailingslashit( get_option( 'home' ) ) : $absolute_home_url;
83
84                         $code              = ! $this->dir_default && $code === $this->default_language ? '' : $code;
85                         $current_language  = $this->get_lang_from_url_string( $source_url );
86                         $current_language  = ! $this->dir_default && $current_language === $this->default_language ? '' : $current_language;
87
88                         $code             = isset( $this->language_codes_map[ $code ] ) ? $this->language_codes_map[ $code ] : $code;
89                         $current_language = isset( $this->language_codes_map[ $current_language ] ) ? $this->language_codes_map[ $current_language ] : $current_language;
90
91                         $redirector = new WPML_WPSEO_Redirection();
92
93                         if ( ! $redirector->is_redirection() ) {
94                                 $source_url = str_replace(
95                                         array(
96                                                 trailingslashit( $absolute_home_url . $current_language ),
97                                                 '/' . $code . '//',
98                                         ),
99                                         array(
100                                                 $code ? ( $absolute_home_url . $code . '/' ) : trailingslashit( $absolute_home_url ),
101                                                 '/' . $code . '/',
102                                         ),
103                                         $source_url
104                                 );
105                         }
106                 }
107
108                 return $this->slash_helper->maybe_user_trailingslashit( $source_url, 'untrailingslashit' );
109         }
110
111         /**
112          * @param string $url
113          * @param string $langauge
114          *
115          * @return string
116          */
117         public function get_home_url_relative( $url, $language ) {
118                 $language = ! $this->dir_default && $language === $this->default_language ? '' : $language;
119                 $language = isset( $this->language_codes_map[ $language ] ) ? $this->language_codes_map[ $language ] : $language;
120
121                 if ( $language ) {
122                         return '/' . $language . $url;
123                 } else {
124                         return $url;
125                 }
126         }
127
128         /**
129          * Will return true if root URL or child of root URL
130          *
131          * @param string $url
132          *
133          * @return bool
134          */
135         private function is_root_url( $url ) {
136                 $result  = false;
137
138                 if ( isset( $this->urls_settings['root_page'], $this->urls_settings['show_on_root'] ) &&
139                      'page' === $this->urls_settings['show_on_root'] &&
140                         ! empty( $this->urls_settings['directory_for_default_language'] )
141                 ) {
142
143                         $root_url = $this->get_root_url();
144                         if ( $root_url ) {
145                                 $result = strpos( trailingslashit( $url ), $root_url ) === 0;
146                         }
147                 }
148
149                 return $result;
150         }
151
152         /**
153          * @return string|bool
154          */
155         private function get_root_url() {
156                 if ( null === $this->root_url ) {
157                         $root_post = get_post( $this->urls_settings['root_page'] );
158
159                         if ( $root_post ) {
160                                 $this->root_url = trailingslashit( $this->get_url_helper()->get_abs_home() ) . $root_post->post_name;
161                                 $this->root_url = trailingslashit( $this->root_url );
162                         } else {
163                                 $this->root_url = false;
164                         }
165                 }
166
167                 return $this->root_url;
168         }
169
170         /**
171          * @param string $source_url
172          *
173          * @return string
174          */
175         private function filter_source_url( $source_url ) {
176                 if ( false === strpos( $source_url, '?' ) ) {
177                         $source_url = trailingslashit( $source_url );
178                 } elseif ( false !== strpos( $source_url, '?' ) && false === strpos( $source_url, '/?' ) ) {
179                         $source_url = str_replace( '?', '/?', $source_url );
180                 }
181
182                 return $source_url;
183         }
184 }