PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.2.20
Permalink Manager Lite v2.2.20
2.6.0 2.5.5 2.5.4 2.5.3.4 2.2.18 2.2.19.2 2.2.19.3 2.2.19.3.1 2.2.2 2.2.20 2.2.20.1 2.2.20.3 2.2.4 2.2.5 2.2.6 2.2.7.2 2.2.7.3 2.2.7.5 2.2.7.6 2.2.8.4 2.2.8.5 2.2.8.6 2.2.8.7 2.2.8.9 2.2.9.1 2.2.9.2 2.2.9.2.1 2.2.9.3 2.2.9.4 2.2.9.6 2.2.9.7 2.2.9.9 2.3.0 2.3.1.1 2.4.0 2.4.1 2.4.1.2 2.4.1.3 2.4.1.4 2.4.1.5 2.4.1.6 2.4.2 2.4.2.1 2.4.3 2.4.3.1 2.4.3.2 2.4.3.3 2.4.3.4 2.4.4 2.4.4.1 2.4.4.2 2.4.4.3 2.5.0 2.5.1 2.5.1.1 2.5.1.2 2.5.1.3 2.5.1.4 2.5.2 2.5.2.1 2.5.2.2 2.5.2.3 2.5.2.4 2.5.3 2.5.3.1 2.5.3.2 2.5.3.3 trunk 0.2 0.3 0.3.1 0.3.2 0.3.3 0.3.4 0.4 0.4.1 0.4.2 0.4.3 0.4.4 0.4.6 0.4.7 0.4.8 0.4.9 0.5.3 0.5.4 1.0.0 1.0.1 1.0.4 1.1.0 1.1.1 1.1.2 1.11.6.3 2.0.0 2.0.3 2.0.4 2.0.4.3 2.0.5.1 2.0.5.2 2.0.5.3 2.0.5.3.1 2.0.5.4 2.0.5.4a 2.0.5.5 2.0.5.6 2.0.5.6.1 2.0.5.7 2.0.5.9a 2.0.6.2.1 2.0.6.2a 2.0.6.3 2.1.0 2.1.1 2.1.2.4 2.2.0 2.2.1.1 2.2.1.2 2.2.11 2.2.12 2.2.13.1 2.2.14 2.2.15.1 2.2.16 2.2.17
permalink-manager / includes / core / permalink-manager-language-plugins.php
permalink-manager / includes / core Last commit date
permalink-manager-actions.php 3 years ago permalink-manager-admin-functions.php 3 years ago permalink-manager-core-functions.php 3 years ago permalink-manager-debug.php 3 years ago permalink-manager-gutenberg.php 3 years ago permalink-manager-helper-functions.php 3 years ago permalink-manager-language-plugins.php 3 years ago permalink-manager-third-parties.php 3 years ago permalink-manager-uri-functions-post.php 3 years ago permalink-manager-uri-functions.php 3 years ago
permalink-manager-language-plugins.php
674 lines
1 <?php
2
3 /**
4 * Third parties integration
5 */
6 class Permalink_Manager_Language_Plugins extends Permalink_Manager_Class {
7
8 public function __construct() {
9 add_action('init', array($this, 'init_hooks'), 99);
10 }
11
12 function init_hooks() {
13 global $sitepress_settings, $permalink_manager_options, $polylang, $translate_press_settings;
14
15 // 1. WPML, Polylang & TranslatePress
16 if($sitepress_settings || !empty($polylang->links_model->options) || class_exists('TRP_Translate_Press')) {
17 // Detect Post/Term function
18 add_filter('permalink_manager_detected_post_id', array($this, 'fix_language_mismatch'), 9, 3);
19 add_filter('permalink_manager_detected_term_id', array($this, 'fix_language_mismatch'), 9, 3);
20
21 // Fix posts page
22 // else {
23 add_filter('permalink_manager_filter_query', array($this, 'fix_posts_page'), 5, 5);
24 // }
25
26 // URI Editor
27 add_filter('permalink_manager_uri_editor_extra_info', array($this, 'language_column_uri_editor'), 9, 3);
28
29 // Adjust front page ID
30 add_filter('permalink_manager_is_front_page', array($this, 'wpml_is_front_page'), 9, 3);
31
32 // Get translation mode
33 $mode = 0;
34
35 // A. WPML
36 if(isset($sitepress_settings['language_negotiation_type'])) {
37 $url_settings = $sitepress_settings['language_negotiation_type'];
38
39 if(in_array($sitepress_settings['language_negotiation_type'], array(1, 2))) {
40 $mode = 'prepend';
41 } else if($sitepress_settings['language_negotiation_type'] == 3) {
42 $mode = 'append';
43 }
44 }
45 // B. Polylang
46 else if(isset($polylang->links_model->options['force_lang'])) {
47 $url_settings = $polylang->links_model->options['force_lang'];
48
49 if(in_array($url_settings, array(1, 2, 3))) {
50 $mode = 'prepend';
51 }
52 }
53 // C. TranslatePress
54 else if(class_exists('TRP_Translate_Press')) {
55 $translate_press_settings = get_option('trp_settings');
56
57 $mode = 'prepend';
58 }
59
60 if($mode === 'prepend') {
61 add_filter('permalink_manager_detect_uri', array($this, 'detect_uri_language'), 9, 3);
62 add_filter('permalink_manager_filter_permalink_base', array($this, 'prepend_lang_prefix'), 9, 2);
63 add_filter('template_redirect', array($this, 'wpml_redirect'), 0, 998 );
64 } else if($mode === 'append') {
65 add_filter('permalink_manager_filter_final_post_permalink', array($this, 'append_lang_prefix'), 5, 2);
66 add_filter('permalink_manager_filter_final_term_permalink', array($this, 'append_lang_prefix'), 5, 2);
67 add_filter('permalink_manager_detect_uri', array($this, 'wpml_ignore_lang_query_parameter'), 9);
68 }
69
70 // Translate permastructures
71 add_filter('permalink_manager_filter_permastructure', array($this, 'translate_permastructure'), 9, 2);
72
73 // Translate custom permalinks
74 if($this->is_wpml_compatible()) {
75 add_filter('permalink_manager_filter_final_post_permalink', array($this, 'translate_permalinks'), 9, 2);
76 }
77
78 // Translate post type slug
79 if(class_exists('WPML_Slug_Translation')) {
80 add_filter('permalink_manager_filter_post_type_slug', array($this, 'wpml_translate_post_type_slug'), 9, 3);
81 }
82
83 // Translate WooCommerce endpoints
84 if(class_exists('WCML_Endpoints')) {
85 add_filter('request', array($this, 'wpml_translate_wc_endpoints'), 99999);
86 }
87
88 // Edit custom URI using WPML Classic Translation Editor
89 if(class_exists('WPML_Translation_Editor_UI')) {
90 add_filter('wpml_tm_adjust_translation_fields', array($this, 'wpml_translation_edit_uri'), 999, 2);
91 add_action('icl_pro_translation_saved', array($this, 'wpml_translation_save_uri'), 999, 3);
92 add_filter('wpml_translation_editor_save_job_data', array($this, 'wpml_translation_save_uri'), 999, 2);
93 }
94
95 // Generate custom permalink after WPML's Advanced Translation editor is used
96 if(!empty($sitepress_settings['translation-management']) && !empty($sitepress_settings['translation-management']['doc_translation_method']) && $sitepress_settings['translation-management']['doc_translation_method'] == 'ATE') {
97 add_action('icl_pro_translation_completed', array($this, 'regenerate_uri_after_wpml_translation_completed'), 99, 3);
98 }
99
100 add_action('icl_make_duplicate', array($this, 'wpml_duplicate_uri'), 999, 4);
101
102 // Allow canonical redirect for default language if "Hide URL language information for default language" is turned on in Polylang settings
103 if(!empty($polylang) && !empty($polylang->links_model) && !empty($polylang->links_model->options['hide_default'])) {
104 add_filter('permalink_manager_filter_query', array($this, 'pl_allow_canonical_redirect'), 3, 5);
105 }
106 }
107 }
108
109 /**
110 * Let users decide if they want Permalink Manager to force language code in the custom permalinks
111 */
112 public static function is_wpml_compatible() {
113 global $permalink_manager_options;
114
115 // Use the current language if translation is not available but fallback mode is turned on
116 return (!empty($permalink_manager_options['general']['wpml_support'])) ? $permalink_manager_options['general']['wpml_support'] : false;
117 }
118
119 /**
120 * WPML/Polylang/TranslatePress filters
121 */
122 public static function get_language_code($element) {
123 global $TRP_LANGUAGE, $translate_press_settings, $icl_adjust_id_url_filter_off, $sitepress, $polylang, $wpml_post_translations, $wpml_term_translations;
124
125 // Disable WPML adjust ID filter
126 $icl_adjust_id_url_filter_off = true;
127
128 // Fallback
129 if(is_string($element) && strpos($element, 'tax-') !== false) {
130 $element_id = intval(preg_replace("/[^0-9]/", "", $element));
131 $element = get_term($element_id);
132 } else if(is_numeric($element)) {
133 $element = get_post($element);
134 }
135
136 // A. TranslatePress
137 if(!empty($TRP_LANGUAGE)) {
138 $lang_code = self::get_translatepress_language_code($TRP_LANGUAGE);
139 }
140 // B. Polylang
141 else if(!empty($polylang) && function_exists('pll_get_post_language')) {
142 if(isset($element->post_type)) {
143 $lang_code = pll_get_post_language($element->ID, 'slug');
144 } else if(isset($element->taxonomy)) {
145 $lang_code = pll_get_term_language($element->term_id, 'slug');
146 }
147 }
148 // C. WPML
149 else if(!empty($sitepress)) {
150 $is_wpml_compatible = (method_exists($sitepress, 'is_display_as_translated_post_type')) ? self::is_wpml_compatible() : false;
151
152 if(isset($element->post_type)) {
153 $element_id = $element->ID;
154 $element_type = $element->post_type;
155
156 $fallback_lang_on = ($is_wpml_compatible) ? $sitepress->is_display_as_translated_post_type($element_type) : false;
157 } else if(isset($element->taxonomy)) {
158 $element_id = $element->term_taxonomy_id;
159 $element_type = $element->taxonomy;
160
161 $fallback_lang_on = ($is_wpml_compatible) ? $sitepress->is_display_as_translated_taxonomy($element_type) : false;
162 } else {
163 return false;
164 }
165
166 if(!empty($fallback_lang_on) && !is_admin() && !wp_doing_ajax() && !defined('REST_REQUEST')) {
167 $current_language = $sitepress->get_current_language();
168
169 if(!empty($element->post_type)) {
170 $force_current_lang = $wpml_post_translations->element_id_in($element_id, $current_language) ? false : $current_language;
171 } else if(!empty($element->taxonomy)) {
172 $force_current_lang = $wpml_term_translations->element_id_in($element_id, $current_language) ? false : $current_language;
173 }
174 }
175
176 $lang_code = (!empty($force_current_lang)) ? $force_current_lang : apply_filters('wpml_element_language_code', null, array('element_id' => $element_id, 'element_type' => $element_type));
177 }
178
179 // Enable WPML adjust ID filter
180 $icl_adjust_id_url_filter_off = false;
181
182 // Use default language if nothing detected
183 return ($lang_code) ? $lang_code : self::get_default_language();
184 }
185
186 public static function get_translatepress_language_code($lang) {
187 global $translate_press_settings;
188
189 if(!empty($translate_press_settings['url-slugs'])) {
190 $lang_code = (!empty($translate_press_settings['url-slugs'][$lang])) ? $translate_press_settings['url-slugs'][$lang] : '';
191 }
192
193 return (!empty($lang_code)) ? $lang_code : false;
194 }
195
196 public static function get_default_language() {
197 global $sitepress, $translate_press_settings;
198
199 if(function_exists('pll_default_language')) {
200 $def_lang = pll_default_language('slug');
201 } else if(is_object($sitepress)) {
202 $def_lang = $sitepress->get_default_language();
203 } else if(!empty($translate_press_settings['default-language'])) {
204 $def_lang = self::get_translatepress_language_code($translate_press_settings['default-language']);
205 } else {
206 $def_lang = '';
207 }
208
209 return $def_lang;
210 }
211
212 public static function get_all_languages($exclude_default_language = false) {
213 global $sitepress, $sitepress_settings, $polylang, $translate_press_settings;
214
215 $languages_array = $active_languages = array();
216 $default_language = self::get_default_language();
217
218 if(!empty($sitepress_settings['active_languages'])) {
219 $languages_array = $sitepress_settings['active_languages'];
220 } elseif(function_exists('pll_languages_list')) {
221 $languages_array = pll_languages_list(array('fields' => null));
222 } if(!empty($translate_press_settings['url-slugs'])) {
223 // $languages_array = $translate_press_settings['url-slugs'];
224 }
225
226 // Get native language names as value
227 if($languages_array) {
228 foreach($languages_array as $val) {
229 if(!empty($sitepress)) {
230 $lang = $val;
231 $lang_details = $sitepress->get_language_details($lang);
232 $language_name = $lang_details['native_name'];
233 } else if(!empty($val->name)) {
234 $lang = $val->slug;
235 $language_name = $val->name;
236 }
237
238 $active_languages[$lang] = (!empty($language_name)) ? sprintf('%s <span>(%s)</span>', $language_name, $lang) : '-';
239 }
240
241 // Exclude default language if needed
242 if($exclude_default_language && $default_language && !empty($active_languages[$default_language])) {
243 unset($active_languages[$default_language]);
244 }
245 }
246
247 return (array) $active_languages;
248 }
249
250 function fix_language_mismatch($item_id, $uri_parts, $is_term = false) {
251 global $wp, $polylang, $language_code, $permalink_manager_options;
252
253 $mode = (!empty($permalink_manager_options['general']['fix_language_mismatch'])) ? $permalink_manager_options['general']['fix_language_mismatch'] : 0;
254
255 if($is_term) {
256 $element = get_term($item_id);
257 if(!empty($element) && !is_wp_error($element)) {
258 $element_id = $element->term_taxonomy_id;
259 $element_type = $element->taxonomy;
260 } else {
261 return false;
262 }
263 } else {
264 $element = get_post($item_id);
265
266 if(!empty($element->post_type)) {
267 $element_id = $item_id;
268 $element_type = $element->post_type;
269 }
270 }
271
272 // Stop if no term or post is detected
273 if(empty($element)) { return false; }
274
275 // Get the language code of the found post/term
276 $element_language_code = self::get_language_code($element);
277
278 // Get the detected language code
279 if(defined('ICL_LANGUAGE_CODE')) {
280 $detected_language_code = ICL_LANGUAGE_CODE;
281 } else if(!empty($uri_parts['lang'])) {
282 $detected_language_code = $uri_parts['lang'];
283 } else {
284 return $item_id;
285 }
286
287 if($detected_language_code !== $element_language_code) {
288 // A. Display the content in requested language
289 if($mode == 1) {
290 if(!empty($polylang)) {
291 if(function_exists('pll_get_post') && !$is_term) {
292 $translated_item_id = pll_get_post($element_id, $detected_language_code);
293 } else if(function_exists('pll_get_term') && $is_term) {
294 $translated_item_id = pll_get_term($element_id, $detected_language_code);
295 }
296
297 $item_id = (!empty($translated_item_id)) ? $translated_item_id : $item_id;
298 } else {
299 $item_id = apply_filters('wpml_object_id', $element_id, $element_type);
300 }
301 }
302 // C. Display "404 error"
303 else {
304 $item_id = 0;
305 }
306 }
307
308 return $item_id;
309 }
310
311 /**
312 * 5C. Fix for WPML (language switcher on blog page)
313 */
314 function fix_posts_page($query, $old_query, $uri_parts, $pm_query, $content_type) {
315 if(empty($pm_query['id']) || !is_numeric($pm_query['id'])) {
316 return $query;
317 }
318
319 $blog_page_id = apply_filters('wpml_object_id', get_option('page_for_posts'), 'page');
320 $element_id = apply_filters('wpml_object_id', $pm_query['id'], 'page');
321
322 if(!empty($blog_page_id) && !empty($blog_page_id) && ($blog_page_id == $element_id) && !isset($query['page'])) {
323 $query['page'] = '';
324 }
325
326 return $query;
327 }
328
329 function detect_uri_language($uri_parts, $request_url, $endpoints) {
330 global $sitepress, $sitepress_settings, $polylang, $translate_press_settings;
331
332 if(!empty($sitepress_settings['active_languages'])) {
333 $languages_list = (array) $sitepress_settings['active_languages'];
334 } elseif(function_exists('pll_languages_list')) {
335 $languages_array = pll_languages_list();
336 $languages_list = (is_array($languages_array)) ? (array) $languages_array : "";
337 } elseif($translate_press_settings['url-slugs']) {
338 $languages_list = $translate_press_settings['url-slugs'];
339 }
340
341 if(is_array($languages_list)) {
342 $languages_list = implode("|", $languages_list);
343 } else {
344 return $uri_parts;
345 }
346
347 $default_language = self::get_default_language();
348
349 // Fix for multidomain language configuration
350 if((isset($sitepress_settings['language_negotiation_type']) && $sitepress_settings['language_negotiation_type'] == 2) || (!empty($polylang->options['force_lang']) && $polylang->options['force_lang'] == 3)) {
351 if(!empty($polylang->options['domains'])) {
352 $domains = (array) $polylang->options['domains'];
353 } else if(!empty($sitepress_settings['language_domains'])) {
354 $domains = (array) $sitepress_settings['language_domains'];
355 }
356
357 foreach($domains as &$domain) {
358 $domain = preg_replace('/((http(s)?:\/\/(www\.)?)|(www\.))?(.+?)\/?$/', 'http://$6', $domain);
359 }
360
361 $request_url = trim(str_replace($domains, "", $request_url), "/");
362 }
363
364 if(!empty($languages_list)) {
365 //preg_match("/^(?:({$languages_list})\/)?(.+?)(?|\/({$endpoints})[\/$]([^\/]*)|\/()([\d+]))?\/?$/i", $request_url, $regex_parts);
366 preg_match("/^(?:({$languages_list})\/)?(.+?)(?|\/({$endpoints})(?|\/(.*)|$)|\/()([\d]+)\/?)?$/i", $request_url, $regex_parts);
367
368 $uri_parts['lang'] = (!empty($regex_parts[1])) ? $regex_parts[1] : $default_language;
369 $uri_parts['uri'] = (!empty($regex_parts[2])) ? $regex_parts[2] : "";
370 $uri_parts['endpoint'] = (!empty($regex_parts[3])) ? $regex_parts[3] : "";
371 $uri_parts['endpoint_value'] = (!empty($regex_parts[4])) ? $regex_parts[4] : "";
372 }
373
374 return $uri_parts;
375 }
376
377 static function prepend_lang_prefix($base, $element, $language_code = '') {
378 global $sitepress_settings, $polylang, $permalink_manager_uris, $translate_press_settings;
379
380 if(!empty($element) && empty($language_code)) {
381 $language_code = self::get_language_code($element);
382
383 // Last instance - use language paramater from &_GET array
384 $language_code = (is_admin() && empty($language_code) && !empty($_GET['lang'])) ? sanitize_key($_GET['lang']) : $language_code;
385 }
386
387 // Adjust URL base
388 if(!empty($language_code)) {
389 $default_language_code = self::get_default_language();
390 $home_url = get_home_url();
391
392 // Hide language code if "Use directory for default language" option is enabled
393 $hide_prefix_for_default_lang = ((isset($sitepress_settings['urls']['directory_for_default_language']) && $sitepress_settings['urls']['directory_for_default_language'] != 1) || !empty($polylang->links_model->options['hide_default']) || (!empty($translate_press_settings) && $translate_press_settings['add-subdirectory-to-default-language'] !== 'yes')) ? true : false;
394
395 // A. Different domain per language
396 if((isset($sitepress_settings['language_negotiation_type']) && $sitepress_settings['language_negotiation_type'] == 2) || (!empty($polylang->options['force_lang']) && $polylang->options['force_lang'] == 3)) {
397 if(!empty($polylang->options['domains'])) {
398 $domains = $polylang->options['domains'];
399 } else if(!empty($sitepress_settings['language_domains'])) {
400 $domains = $sitepress_settings['language_domains'];
401 }
402
403 // Replace the domain name
404 if(!empty($domains) && !empty($domains[$language_code])) {
405 $base = trim($domains[$language_code], "/");
406
407 // Append URL scheme
408 if(!preg_match("~^(?:f|ht)tps?://~i", $base)) {
409 $scehme = parse_url($home_url, PHP_URL_SCHEME);
410 $base = "{$scehme}://{$base}";
411 }
412 }
413 }
414 // B. Prepend language code
415 else if(!empty($polylang->options['force_lang']) && $polylang->options['force_lang'] == 2) {
416 if($hide_prefix_for_default_lang && ($default_language_code == $language_code)) {
417 return $base;
418 } else {
419 $base = preg_replace('/(https?:\/\/)/', "$1{$language_code}.", $home_url);
420 }
421 }
422 // C. Append prefix
423 else {
424 if($hide_prefix_for_default_lang && ($default_language_code == $language_code)) {
425 return $base;
426 } else {
427 $base .= "/{$language_code}";
428 }
429 }
430 }
431
432 return $base;
433 }
434
435 function append_lang_prefix($permalink, $element) {
436 global $sitepress_settings, $polylang, $permalink_manager_uris;
437
438 $language_code = self::get_language_code($element);
439 $default_language_code = self::get_default_language();
440
441 // Last instance - use language paramater from &_GET array
442 if(is_admin()) {
443 $language_code = (empty($language_code) && !empty($_GET['lang'])) ? $_GET['lang'] : $language_code;
444 }
445
446 // B. Append ?lang query parameter
447 if(isset($sitepress_settings['language_negotiation_type']) && $sitepress_settings['language_negotiation_type'] == 3) {
448 if($default_language_code == $language_code) {
449 return $permalink;
450 } else if(strpos($permalink, "lang=") === false) {
451 $permalink .= "?lang={$language_code}";
452 }
453 }
454
455 return $permalink;
456 }
457
458 function language_column_uri_editor($output, $column, $element) {
459 $language_code = self::get_language_code($element);
460 $output .= (!empty($language_code)) ? sprintf(" | <span><strong>%s:</strong> %s</span>", __("Language"), $language_code) : "";
461
462 return $output;
463 }
464
465 function wpml_is_front_page($bool, $page_id, $front_page_id) {
466 $default_language_code = self::get_default_language();
467 $page_id = apply_filters('wpml_object_id', $page_id, 'page', true, $default_language_code);
468
469 return (!empty($page_id) && $page_id == $front_page_id) ? true : $bool;
470 }
471
472 function wpml_ignore_lang_query_parameter($uri_parts) {
473 global $permalink_manager_uris;
474
475 foreach($permalink_manager_uris as &$uri) {
476 $uri = trim(strtok($uri, '?'), "/");
477 }
478
479 return $uri_parts;
480 }
481
482 function wpml_redirect() {
483 global $language_code, $wp_query;
484
485 if(!empty($language_code) && defined('ICL_LANGUAGE_CODE') && ICL_LANGUAGE_CODE != $language_code && !empty($wp_query->query['do_not_redirect'])) {
486 unset($wp_query->query['do_not_redirect']);
487 }
488 }
489
490 /*
491 * Copy WPML URL hooks and use them for custom permalinks filtered with Permalink Manager
492 */
493 function translate_permalinks($permalink, $post) {
494 global $wpml_url_filters, $wp_filter;
495
496 if(!empty($wpml_url_filters)) {
497 $wpml_url_hook_name = _wp_filter_build_unique_id('post_link', array($wpml_url_filters, 'permalink_filter'), 1);
498
499 if(has_filter('post_link', $wpml_url_hook_name)) {
500 $permalink = $wpml_url_filters->permalink_filter($permalink, $post);
501 }
502 }
503
504 return $permalink;
505 }
506
507 function translate_permastructure($permastructure, $element) {
508 global $permalink_manager_permastructs, $pagenow;;
509
510 // Get element language code
511 if(!empty($_REQUEST['data']) && is_string($_REQUEST['data']) && strpos($_REQUEST['data'], "target_lang")) {
512 $language_code = preg_replace('/(.*target_lang=)([^=&]+)(.*)/', '$2', $_REQUEST['data']);
513 } else if(in_array($pagenow, array('post.php', 'post-new.php')) && !empty($_GET['lang'])) {
514 $language_code = $_GET['lang'];
515 } else if(!empty($_REQUEST['icl_post_language'])) {
516 $language_code = $_REQUEST['icl_post_language'];
517 } else if(!empty($_POST['action']) && $_POST['action'] == 'pm_save_permalink' && defined('ICL_LANGUAGE_CODE')) {
518 $language_code = ICL_LANGUAGE_CODE;
519 } else {
520 $language_code = self::get_language_code($element);
521 }
522
523 if(!empty($element->ID)) {
524 $translated_permastructure = (!empty($permalink_manager_permastructs["post_types"]["{$element->post_type}_{$language_code}"])) ? $permalink_manager_permastructs["post_types"]["{$element->post_type}_{$language_code}"] : '';
525 } else if(!empty($element->term_id)) {
526 $translated_permastructure = (!empty($permalink_manager_permastructs["taxonomies"]["{$element->taxonomy}_{$language_code}"])) ? $permalink_manager_permastructs["taxonomies"]["{$element->taxonomy}_{$language_code}"] : '';
527 }
528
529 return (!empty($translated_permastructure)) ? $translated_permastructure : $permastructure;
530 }
531
532 function wpml_translate_post_type_slug($post_type_slug, $element, $post_type) {
533 $post = (is_integer($element)) ? get_post($element) : $element;
534 $language_code = self::get_language_code($post);
535
536 $post_type_slug = apply_filters('wpml_get_translated_slug', $post_type_slug, $post_type, $language_code);
537
538 // Translate %post_type% tag in custom permastructures
539 return $post_type_slug;
540 }
541
542 function wpml_translate_wc_endpoints($request) {
543 global $woocommerce, $wpdb;
544
545 if(!empty($woocommerce->query->query_vars)) {
546 // Get WooCommerce original endpoints
547 $endpoints = $woocommerce->query->query_vars;
548
549 // Get all endppoint translations
550 $endpoint_translations = $wpdb->get_results("SELECT t.value AS translated_endpoint, t.language, s.value AS endpoint FROM {$wpdb->prefix}icl_string_translations AS t LEFT JOIN {$wpdb->prefix}icl_strings AS s ON t.string_id = s.id WHERE context = 'WP Endpoints'");
551
552 // Replace translate endpoint with its original name
553 foreach($endpoint_translations as $endpoint) {
554 if(isset($request[$endpoint->translated_endpoint]) && ($endpoint->endpoint !== $endpoint->translated_endpoint)) {
555 $request[$endpoint->endpoint] = $request[$endpoint->translated_endpoint];
556 unset($request[$endpoint->translated_endpoint]);
557 }
558 }
559 }
560
561 return $request;
562 }
563
564 /**
565 * Generate custom permalink after WPML's Advanced Translation editor is used
566 */
567 function regenerate_uri_after_wpml_translation_completed($post_id, $postdata, $job) {
568 global $permalink_manager_uris;
569
570 // Get the default custom permalink based on a permastructure set with Permalink Manager
571 if(empty($permalink_manager_uris[$post_id])) {
572 $permalink_manager_uris[$post_id] = Permalink_Manager_URI_Functions_Post::get_default_post_uri($post_id);
573
574 // Save the update
575 update_option('permalink-manager-uris', $permalink_manager_uris);
576 }
577 }
578
579 /**
580 * Edit custom URI using WPML Classic Translation Editor
581 */
582 function wpml_translation_edit_uri($fields, $job) {
583 global $permalink_manager_uris;
584
585 $element_type = (!empty($job->original_post_type) && strpos($job->original_post_type, 'post_') !== false) ? preg_replace('/^(post_)/', '', $job->original_post_type) : '';
586
587 if(!empty($element_type)) {
588 $original_id = $job->original_doc_id;
589 $translation_id = apply_filters('wpml_object_id', $original_id, $element_type, false, $job->language_code);
590
591 $original_custom_uri = Permalink_Manager_URI_Functions_Post::get_post_uri($original_id, true);
592
593 if(!empty($translation_id)) {
594 $translation_custom_uri = Permalink_Manager_URI_Functions_Post::get_post_uri($translation_id, true);
595 $uri_translation_complete = (!empty($permalink_manager_uris[$translation_id])) ? '1' : '0';
596 } else {
597 $translation_custom_uri = $original_custom_uri;
598 $uri_translation_complete = '0';
599 }
600
601 $fields[] = array(
602 'field_type' => 'pm-custom_uri',
603 //'tid' => 9999,
604 'field_data' => $original_custom_uri,
605 'field_data_translated' => $translation_custom_uri,
606 'field_finished' => $uri_translation_complete,
607 'field_style' => '0',
608 'title' => 'Custom URI',
609 );
610 }
611
612 return $fields;
613 }
614
615 function wpml_translation_save_uri($in = '', $data = '', $job = '') {
616 global $permalink_manager_uris;
617
618 // A. Save the URI also when the translation is uncompleted
619 if(!empty($in['fields'])) {
620 $data = $in['fields'];
621
622 $original_id = $in['job_post_id'];
623 $element_type = (strpos($in['job_post_type'], 'post_') !== false) ? preg_replace('/^(post_)/', '', $in['job_post_type']) : '';
624
625 $translation_id = apply_filters('wpml_object_id', $original_id, $element_type, false, $in['target_lang']);
626 }
627 // B. Save the URI also when the translation is completed
628 else if(is_numeric($in)) {
629 $translation_id = $in;
630 }
631
632 if(isset($data['pm-custom_uri']) && isset($data['pm-custom_uri']['data']) && !empty($translation_id)) {
633 $permalink_manager_uris[$translation_id] = (!empty($data['pm-custom_uri']['data'])) ? Permalink_Manager_Helper_Functions::sanitize_title($data['pm-custom_uri']['data'], true) : Permalink_Manager_URI_Functions_Post::get_default_post_uri($translation_id);
634
635 update_option('permalink-manager-uris', $permalink_manager_uris);
636 }
637
638 // Return the data when the translation is uncompleted
639 if(!empty($in['fields'])) {
640 return $in;
641 }
642 }
643
644 function wpml_duplicate_uri($master_post_id, $lang, $post_array, $id) {
645 global $permalink_manager_uris;
646
647 // Trigger the function only if duplicate is created in the metabox
648 if(empty($_POST['action']) || $_POST['action'] !== 'make_duplicates') { return; }
649
650 $permalink_manager_uris[$id] = Permalink_Manager_URI_Functions_Post::get_default_post_uri($id);
651
652 update_option('permalink-manager-uris', $permalink_manager_uris);
653 }
654
655 function pl_allow_canonical_redirect($query, $old_query, $uri_parts, $pm_query, $content_type) {
656 global $polylang;
657
658 // Run only if "Hide URL language information for default language" is turned on in Polylang settings
659 if(!empty($pm_query['id']) && !empty($pm_query['lang'])) {
660 $url_lang = $polylang->links_model->get_language_from_url();
661 $def_lang = pll_default_language('slug');
662
663 // Check if the slug of default language is present in the requested URL
664 if($url_lang == $def_lang) {
665 // Allow canonical redirect
666 unset($query['do_not_redirect']);
667 }
668 }
669
670 return $query;
671 }
672
673 }
674