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