PluginProbe ʕ •ᴥ•ʔ
Permalink Manager Lite / 2.2.16
Permalink Manager Lite v2.2.16
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 4 years ago permalink-manager-admin-functions.php 4 years ago permalink-manager-core-functions.php 4 years ago permalink-manager-debug.php 4 years ago permalink-manager-gutenberg.php 4 years ago permalink-manager-helper-functions.php 4 years ago permalink-manager-language-plugins.php 4 years ago permalink-manager-third-parties.php 4 years ago permalink-manager-uri-functions-post.php 4 years ago permalink-manager-uri-functions.php 4 years ago
permalink-manager-language-plugins.php
634 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 add_filter('permalink_manager_filter_final_post_permalink', array($this, 'translate_permalinks'), 9, 2);
75
76 // Translate post type slug
77 if(class_exists('WPML_Slug_Translation')) {
78 add_filter('permalink_manager_filter_post_type_slug', array($this, 'wpml_translate_post_type_slug'), 9, 3);
79 }
80
81 // Translate WooCommerce endpoints
82 if(class_exists('WCML_Endpoints')) {
83 add_filter('request', array($this, 'wpml_translate_wc_endpoints'), 99999);
84 }
85
86 // Edit custom URI using WPML Classic Translation Editor
87 if(class_exists('WPML_Translation_Editor_UI')) {
88 add_filter('wpml_tm_adjust_translation_fields', array($this, 'wpml_translation_edit_uri'), 999, 2);
89 add_action('icl_pro_translation_saved', array($this, 'wpml_translation_save_uri'), 999, 3);
90 add_filter('wpml_translation_editor_save_job_data', array($this, 'wpml_translation_save_uri'), 999, 2);
91 }
92
93 // Generate custom permalink after WPML's Advanced Translation editor is used
94 if(!empty($sitepress_settings['translation-management']) && !empty($sitepress_settings['translation-management']['doc_translation_method']) && $sitepress_settings['translation-management']['doc_translation_method'] == 'ATE') {
95 add_action('icl_pro_translation_completed', array($this, 'regenerate_uri_after_wpml_translation_completed'), 99, 3);
96 }
97
98 add_action('icl_make_duplicate', array($this, 'wpml_duplicate_uri'), 999, 4);
99
100 // Allow canonical redirect for default language if "Hide URL language information for default language" is turned on in Polylang settings
101 if(!empty($polylang) && !empty($polylang->links_model) && !empty($polylang->links_model->options['hide_default'])) {
102 add_filter('permalink_manager_filter_query', array($this, 'pl_allow_canonical_redirect'), 3, 5);
103 }
104 }
105 }
106
107 /**
108 * WPML/Polylang/TranslatePress filters
109 */
110 public static function get_language_code($element) {
111 global $TRP_LANGUAGE, $translate_press_settings, $icl_adjust_id_url_filter_off;
112
113 // Disable WPML adjust ID filter
114 $icl_adjust_id_url_filter_off = true;
115
116 // Fallback
117 if(is_string($element) && strpos($element, 'tax-') !== false) {
118 $element_id = intval(preg_replace("/[^0-9]/", "", $element));
119 $element = get_term($element_id);
120 } else if(is_numeric($element)) {
121 $element = get_post($element);
122 }
123
124 // A. TranslatePress
125 if(!empty($TRP_LANGUAGE)) {
126 $lang_code = self::get_translatepress_language_code($TRP_LANGUAGE);
127 }
128 // B. WPML & Polylang
129 else {
130 if(isset($element->post_type)) {
131 $element_id = $element->ID;
132 $element_type = $element->post_type;
133 } else if(isset($element->taxonomy)) {
134 $element_id = $element->term_taxonomy_id;
135 $element_type = $element->taxonomy;
136 } else {
137 return false;
138 }
139
140 $lang_code = apply_filters('wpml_element_language_code', null, array('element_id' => $element_id, 'element_type' => $element_type));
141 }
142
143 // Enable WPML adjust ID filter
144 $icl_adjust_id_url_filter_off = false;
145
146 // Use default language if nothing detected
147 return ($lang_code) ? $lang_code : self::get_default_language();
148 }
149
150 public static function get_translatepress_language_code($lang) {
151 global $translate_press_settings;
152
153 if(!empty($translate_press_settings['url-slugs'])) {
154 $lang_code = (!empty($translate_press_settings['url-slugs'][$lang])) ? $translate_press_settings['url-slugs'][$lang] : '';
155 }
156
157 return (!empty($lang_code)) ? $lang_code : false;
158 }
159
160 public static function get_default_language() {
161 global $sitepress, $translate_press_settings;
162
163 if(function_exists('pll_default_language')) {
164 $def_lang = pll_default_language('slug');
165 } else if(is_object($sitepress)) {
166 $def_lang = $sitepress->get_default_language();
167 } else if(!empty($translate_press_settings['default-language'])) {
168 $def_lang = self::get_translatepress_language_code($translate_press_settings['default-language']);
169 } else {
170 $def_lang = '';
171 }
172
173 return $def_lang;
174 }
175
176 public static function get_all_languages($exclude_default_language = false) {
177 global $sitepress, $sitepress_settings, $polylang, $translate_press_settings;
178
179 $languages_array = $active_languages = array();
180 $default_language = self::get_default_language();
181
182 if(!empty($sitepress_settings['active_languages'])) {
183 $languages_array = $sitepress_settings['active_languages'];
184 } elseif(function_exists('pll_languages_list')) {
185 $languages_array = pll_languages_list(array('fields' => null));
186 } if(!empty($translate_press_settings['url-slugs'])) {
187 // $languages_array = $translate_press_settings['url-slugs'];
188 }
189
190 // Get native language names as value
191 if($languages_array) {
192 foreach($languages_array as $val) {
193 if(!empty($sitepress)) {
194 $lang = $val;
195 $lang_details = $sitepress->get_language_details($lang);
196 $language_name = $lang_details['native_name'];
197 } else if(!empty($val->name)) {
198 $lang = $val->slug;
199 $language_name = $val->name;
200 }
201
202 $active_languages[$lang] = (!empty($language_name)) ? sprintf('%s <span>(%s)</span>', $language_name, $lang) : '-';
203 }
204
205 // Exclude default language if needed
206 if($exclude_default_language && $default_language && !empty($active_languages[$default_language])) {
207 unset($active_languages[$default_language]);
208 }
209 }
210
211 return (array) $active_languages;
212 }
213
214 function fix_language_mismatch($item_id, $uri_parts, $is_term = false) {
215 global $wp, $language_code, $permalink_manager_options;
216
217 $mode = (!empty($permalink_manager_options['general']['fix_language_mismatch'])) ? $permalink_manager_options['general']['fix_language_mismatch'] : 0;
218
219 if($is_term) {
220 $element = get_term($item_id);
221 if(!empty($element) && !is_wp_error($element)) {
222 $element_id = $element->term_taxonomy_id;
223 $element_type = $element->taxonomy;
224 } else {
225 return false;
226 }
227 } else {
228 $element = get_post($item_id);
229
230 if(!empty($element->post_type)) {
231 $element_id = $item_id;
232 $element_type = $element->post_type;
233 }
234 }
235
236 // Stop if no term or post is detected
237 if(empty($element)) { return false; }
238
239 // Get the language code of the found post/term
240 $element_language_code = self::get_language_code($element);
241
242 // Get the detected language code
243 if(defined('ICL_LANGUAGE_CODE')) {
244 $detected_language_code = ICL_LANGUAGE_CODE;
245 } else if(!empty($uri_parts['lang'])) {
246 $detected_language_code = $uri_parts['lang'];
247 } else {
248 return $item_id;
249 }
250
251 if($detected_language_code !== $element_language_code) {
252 // A. Display the content in requested language
253 if($mode == 1) {
254 $item_id = apply_filters('wpml_object_id', $element_id, $element_type);
255 }
256 // C. Display "404 error"
257 else {
258 $item_id = 0;
259 }
260 }
261
262 return $item_id;
263 }
264
265 /**
266 * 5C. Fix for WPML (language switcher on blog page)
267 */
268 function fix_posts_page($query, $old_query, $uri_parts, $pm_query, $content_type) {
269 if(empty($pm_query['id']) || !is_numeric($pm_query['id'])) {
270 return $query;
271 }
272
273 $blog_page_id = apply_filters('wpml_object_id', get_option('page_for_posts'), 'page');
274 $element_id = apply_filters('wpml_object_id', $pm_query['id'], 'page');
275
276 if(!empty($blog_page_id) && !empty($blog_page_id) && ($blog_page_id == $element_id) && !isset($query['page'])) {
277 $query['page'] = '';
278 }
279
280 return $query;
281 }
282
283 function detect_uri_language($uri_parts, $request_url, $endpoints) {
284 global $sitepress, $sitepress_settings, $polylang, $translate_press_settings;
285
286 if(!empty($sitepress_settings['active_languages'])) {
287 $languages_list = (array) $sitepress_settings['active_languages'];
288 } elseif(function_exists('pll_languages_list')) {
289 $languages_array = pll_languages_list();
290 $languages_list = (is_array($languages_array)) ? (array) $languages_array : "";
291 } elseif($translate_press_settings['url-slugs']) {
292 $languages_list = $translate_press_settings['url-slugs'];
293 }
294
295 if(is_array($languages_list)) {
296 $languages_list = implode("|", $languages_list);
297 } else {
298 return $uri_parts;
299 }
300
301 $default_language = self::get_default_language();
302
303 // Fix for multidomain language configuration
304 if((isset($sitepress_settings['language_negotiation_type']) && $sitepress_settings['language_negotiation_type'] == 2) || (!empty($polylang->options['force_lang']) && $polylang->options['force_lang'] == 3)) {
305 if(!empty($polylang->options['domains'])) {
306 $domains = (array) $polylang->options['domains'];
307 } else if(!empty($sitepress_settings['language_domains'])) {
308 $domains = (array) $sitepress_settings['language_domains'];
309 }
310
311 foreach($domains as &$domain) {
312 $domain = preg_replace('/((http(s)?:\/\/(www\.)?)|(www\.))?(.+?)\/?$/', 'http://$6', $domain);
313 }
314
315 $request_url = trim(str_replace($domains, "", $request_url), "/");
316 }
317
318 if(!empty($languages_list)) {
319 //preg_match("/^(?:({$languages_list})\/)?(.+?)(?|\/({$endpoints})[\/$]([^\/]*)|\/()([\d+]))?\/?$/i", $request_url, $regex_parts);
320 preg_match("/^(?:({$languages_list})\/)?(.+?)(?|\/({$endpoints})(?|\/(.*)|$)|\/()([\d]+)\/?)?$/i", $request_url, $regex_parts);
321
322 $uri_parts['lang'] = (!empty($regex_parts[1])) ? $regex_parts[1] : $default_language;
323 $uri_parts['uri'] = (!empty($regex_parts[2])) ? $regex_parts[2] : "";
324 $uri_parts['endpoint'] = (!empty($regex_parts[3])) ? $regex_parts[3] : "";
325 $uri_parts['endpoint_value'] = (!empty($regex_parts[4])) ? $regex_parts[4] : "";
326 }
327
328 return $uri_parts;
329 }
330
331 function prepend_lang_prefix($base, $element) {
332 global $sitepress_settings, $polylang, $permalink_manager_uris, $translate_press_settings;
333
334 $language_code = self::get_language_code($element);
335 $default_language_code = self::get_default_language();
336 $home_url = get_home_url();
337
338 // Hide language code if "Use directory for default language" option is enabled
339 $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;
340
341 // Last instance - use language paramater from &_GET array
342 if(is_admin()) {
343 $language_code = (empty($language_code) && !empty($_GET['lang'])) ? $_GET['lang'] : $language_code;
344 }
345
346 // Adjust URL base
347 if(!empty($language_code)) {
348 // A. Different domain per language
349 if((isset($sitepress_settings['language_negotiation_type']) && $sitepress_settings['language_negotiation_type'] == 2) || (!empty($polylang->options['force_lang']) && $polylang->options['force_lang'] == 3)) {
350
351 if(!empty($polylang->options['domains'])) {
352 $domains = $polylang->options['domains'];
353 } else if(!empty($sitepress_settings['language_domains'])) {
354 $domains = $sitepress_settings['language_domains'];
355 }
356
357 $is_term = (!empty($element->term_taxonomy_id)) ? true : false;
358 $element_id = ($is_term) ? "tax-{$element->term_taxonomy_id}" : $element->ID;
359
360 // Filter only custom permalinks
361 if(empty($permalink_manager_uris[$element_id]) || empty($domains)) { return $base; }
362
363 // Replace the domain name
364 if(!empty($domains[$language_code])) {
365 $base = trim($domains[$language_code], "/");
366
367 // Append URL scheme
368 if(!preg_match("~^(?:f|ht)tps?://~i", $base)) {
369 $scehme = parse_url($home_url, PHP_URL_SCHEME);
370 $base = "{$scehme}://{$base}";
371 }
372 }
373 }
374 // B. Prepend language code
375 else if(!empty($polylang->options['force_lang']) && $polylang->options['force_lang'] == 2) {
376 if($hide_prefix_for_default_lang && ($default_language_code == $language_code)) {
377 return $base;
378 } else {
379 $base = preg_replace('/(https?:\/\/)/', "$1{$language_code}.", $home_url);
380 }
381 }
382 // C. Append prefix
383 else {
384 if($hide_prefix_for_default_lang && ($default_language_code == $language_code)) {
385 return $base;
386 } else {
387 $base .= "/{$language_code}";
388 }
389 }
390 }
391
392 return $base;
393 }
394
395 function append_lang_prefix($permalink, $element) {
396 global $sitepress_settings, $polylang, $permalink_manager_uris;
397
398 $language_code = self::get_language_code($element);
399 $default_language_code = self::get_default_language();
400
401 // Last instance - use language paramater from &_GET array
402 if(is_admin()) {
403 $language_code = (empty($language_code) && !empty($_GET['lang'])) ? $_GET['lang'] : $language_code;
404 }
405
406 // B. Append ?lang query parameter
407 if(isset($sitepress_settings['language_negotiation_type']) && $sitepress_settings['language_negotiation_type'] == 3) {
408 if($default_language_code == $language_code) {
409 return $permalink;
410 } else if(strpos($permalink, "lang=") === false) {
411 $permalink .= "?lang={$language_code}";
412 }
413 }
414
415 return $permalink;
416 }
417
418 function language_column_uri_editor($output, $column, $element) {
419 $language_code = self::get_language_code($element);
420 $output .= (!empty($language_code)) ? sprintf(" | <span><strong>%s:</strong> %s</span>", __("Language"), $language_code) : "";
421
422 return $output;
423 }
424
425 function wpml_is_front_page($bool, $page_id, $front_page_id) {
426 $default_language_code = self::get_default_language();
427 $page_id = apply_filters('wpml_object_id', $page_id, 'page', true, $default_language_code);
428
429 return (!empty($page_id) && $page_id == $front_page_id) ? true : $bool;
430 }
431
432 function wpml_ignore_lang_query_parameter($uri_parts) {
433 global $permalink_manager_uris;
434
435 foreach($permalink_manager_uris as &$uri) {
436 $uri = trim(strtok($uri, '?'), "/");
437 }
438
439 return $uri_parts;
440 }
441
442 function wpml_redirect() {
443 global $language_code, $wp_query;
444
445 if(!empty($language_code) && defined('ICL_LANGUAGE_CODE') && ICL_LANGUAGE_CODE != $language_code && !empty($wp_query->query['do_not_redirect'])) {
446 unset($wp_query->query['do_not_redirect']);
447 }
448 }
449
450 /*
451 * Copy WPML URL hooks and use them for custom permalinks filtered with Permalink Manager
452 */
453 function translate_permalinks($permalink, $post) {
454 global $wpml_url_filters, $wp_filter;
455
456 if(!empty($wpml_url_filters)) {
457 $wpml_url_hook_name = _wp_filter_build_unique_id('post_link', array($wpml_url_filters, 'permalink_filter'), 1);
458
459 if(has_filter('post_link', $wpml_url_hook_name)) {
460 $permalink = $wpml_url_filters->permalink_filter($permalink, $post);
461 }
462 }
463
464 return $permalink;
465 }
466
467 function translate_permastructure($permastructure, $element) {
468 global $permalink_manager_permastructs, $pagenow;;
469
470 // Get element language code
471 if(!empty($_REQUEST['data']) && strpos($_REQUEST['data'], "target_lang")) {
472 $language_code = preg_replace('/(.*target_lang=)([^=&]+)(.*)/', '$2', $_REQUEST['data']);
473 } else if(in_array($pagenow, array('post.php', 'post-new.php')) && !empty($_GET['lang'])) {
474 $language_code = $_GET['lang'];
475 } else if(!empty($_REQUEST['icl_post_language'])) {
476 $language_code = $_REQUEST['icl_post_language'];
477 } else if(!empty($_POST['action']) && $_POST['action'] == 'pm_save_permalink' && defined('ICL_LANGUAGE_CODE')) {
478 $language_code = ICL_LANGUAGE_CODE;
479 } else {
480 $language_code = self::get_language_code($element);
481 }
482
483 if(!empty($element->ID)) {
484 $translated_permastructure = (!empty($permalink_manager_permastructs["post_types"]["{$element->post_type}_{$language_code}"])) ? $permalink_manager_permastructs["post_types"]["{$element->post_type}_{$language_code}"] : '';
485 } else if(!empty($element->term_id)) {
486 $translated_permastructure = (!empty($permalink_manager_permastructs["taxonomies"]["{$element->taxonomy}_{$language_code}"])) ? $permalink_manager_permastructs["taxonomies"]["{$element->taxonomy}_{$language_code}"] : '';
487 }
488
489 return (!empty($translated_permastructure)) ? $translated_permastructure : $permastructure;
490 }
491
492 function wpml_translate_post_type_slug($post_type_slug, $element, $post_type) {
493 $post = (is_integer($element)) ? get_post($element) : $element;
494 $language_code = self::get_language_code($post);
495
496 $post_type_slug = apply_filters('wpml_get_translated_slug', $post_type_slug, $post_type, $language_code);
497
498 // Translate %post_type% tag in custom permastructures
499 return $post_type_slug;
500 }
501
502 function wpml_translate_wc_endpoints($request) {
503 global $woocommerce, $wpdb;
504
505 if(!empty($woocommerce->query->query_vars)) {
506 // Get WooCommerce original endpoints
507 $endpoints = $woocommerce->query->query_vars;
508
509 // Get all endppoint translations
510 $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'");
511
512 // Replace translate endpoint with its original name
513 foreach($endpoint_translations as $endpoint) {
514 if(isset($request[$endpoint->translated_endpoint]) && ($endpoint->endpoint !== $endpoint->translated_endpoint)) {
515 $request[$endpoint->endpoint] = $request[$endpoint->translated_endpoint];
516 unset($request[$endpoint->translated_endpoint]);
517 }
518 }
519 }
520
521 return $request;
522 }
523
524 /**
525 * Generate custom permalink after WPML's Advanced Translation editor is used
526 */
527 function regenerate_uri_after_wpml_translation_completed($post_id, $postdata, $job) {
528 global $permalink_manager_uris;
529
530 // Get the default custom permalink based on a permastructure set with Permalink Manager
531 if(empty($permalink_manager_uris[$post_id])) {
532 $permalink_manager_uris[$post_id] = Permalink_Manager_URI_Functions_Post::get_default_post_uri($post_id);
533
534 // Save the update
535 update_option('permalink-manager-uris', $permalink_manager_uris);
536 }
537 }
538
539 /**
540 * Edit custom URI using WPML Classic Translation Editor
541 */
542 function wpml_translation_edit_uri($fields, $job) {
543 global $permalink_manager_uris;
544
545 $element_type = (!empty($job->original_post_type) && strpos($job->original_post_type, 'post_') !== false) ? preg_replace('/^(post_)/', '', $job->original_post_type) : '';
546
547 if(!empty($element_type)) {
548 $original_id = $job->original_doc_id;
549 $translation_id = apply_filters('wpml_object_id', $original_id, $element_type, false, $job->language_code);
550
551 $original_custom_uri = Permalink_Manager_URI_Functions_Post::get_post_uri($original_id, true);
552
553 if(!empty($translation_id)) {
554 $translation_custom_uri = Permalink_Manager_URI_Functions_Post::get_post_uri($translation_id, true);
555 $uri_translation_complete = (!empty($permalink_manager_uris[$translation_id])) ? '1' : '0';
556 } else {
557 $translation_custom_uri = $original_custom_uri;
558 $uri_translation_complete = '0';
559 }
560
561 $fields[] = array(
562 'field_type' => 'pm-custom_uri',
563 //'tid' => 9999,
564 'field_data' => $original_custom_uri,
565 'field_data_translated' => $translation_custom_uri,
566 'field_finished' => $uri_translation_complete,
567 'field_style' => '0',
568 'title' => 'Custom URI',
569 );
570 }
571
572 return $fields;
573 }
574
575 function wpml_translation_save_uri($in = '', $data = '', $job = '') {
576 global $permalink_manager_uris;
577
578 // A. Save the URI also when the translation is uncompleted
579 if(!empty($in['fields'])) {
580 $data = $in['fields'];
581
582 $original_id = $in['job_post_id'];
583 $element_type = (strpos($in['job_post_type'], 'post_') !== false) ? preg_replace('/^(post_)/', '', $in['job_post_type']) : '';
584
585 $translation_id = apply_filters('wpml_object_id', $original_id, $element_type, false, $in['target_lang']);
586 }
587 // B. Save the URI also when the translation is completed
588 else if(is_numeric($in)) {
589 $translation_id = $in;
590 }
591
592 if(isset($data['pm-custom_uri']) && isset($data['pm-custom_uri']['data']) && !empty($translation_id)) {
593 $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);
594
595 update_option('permalink-manager-uris', $permalink_manager_uris);
596 }
597
598 // Return the data when the translation is uncompleted
599 if(!empty($in['fields'])) {
600 return $in;
601 }
602 }
603
604 function wpml_duplicate_uri($master_post_id, $lang, $post_array, $id) {
605 global $permalink_manager_uris;
606
607 // Trigger the function only if duplicate is created in the metabox
608 if(empty($_POST['action']) || $_POST['action'] !== 'make_duplicates') { return; }
609
610 $permalink_manager_uris[$id] = Permalink_Manager_URI_Functions_Post::get_default_post_uri($id);
611
612 update_option('permalink-manager-uris', $permalink_manager_uris);
613 }
614
615 function pl_allow_canonical_redirect($query, $old_query, $uri_parts, $pm_query, $content_type) {
616 global $polylang;
617
618 // Run only if "Hide URL language information for default language" is turned on in Polylang settings
619 if(!empty($pm_query['id']) && !empty($pm_query['lang'])) {
620 $url_lang = $polylang->links_model->get_language_from_url();
621 $def_lang = pll_default_language('slug');
622
623 // Check if the slug of default language is present in the requested URL
624 if($url_lang == $def_lang) {
625 // Allow canonical redirect
626 unset($query['do_not_redirect']);
627 }
628 }
629
630 return $query;
631 }
632
633 }
634