function get_ls_languages($template_args = array()) { /** @var $wp_query WP_Query */ global $wp_query, $w_this_lang, $wpml_post_translations, $wpml_term_translations; $current_language = $this->get_current_language(); $default_language = $this->get_default_language(); $cache_key_args = $template_args ? array_filter($template_args) : array('default'); $cache_key_args[] = $current_language; $cache_key_args[] = $default_language; $cache_key_args = array_filter($cache_key_args); $cache_key = md5(wp_json_encode($cache_key_args)); $cache_group = 'ls_languages'; $found = false; $ls_languages = wp_cache_get($cache_key, $cache_group, $found); if ($found) { return $ls_languages; } if (is_null($this->wp_query)) { $this->set_wp_query(); } // use original wp_query for this // backup current $wp_query if (!isset($wp_query)) { return $this->get_active_languages(); } $_wp_query_back = clone $wp_query; unset($wp_query); global $wp_query; // make it global again after unset $wp_query = clone $this->wp_query; $w_active_languages = $this->get_active_languages(); $this_lang = $this->this_lang; if ($this_lang == 'all') { $w_this_lang = array('code' => 'all', 'english_name' => 'All languages', 'display_name' => __('All languages', 'sitepress')); } else { $w_this_lang = $this->get_language_details($this_lang); } if (isset($template_args['skip_missing'])) { //override default setting $icl_lso_link_empty = !$template_args['skip_missing']; } else { $icl_lso_link_empty = $this->settings['icl_lso_link_empty']; } $languages_helper = new WPML_Languages($wpml_term_translations, $this, $wpml_post_translations); list($translations, $wp_query) = $languages_helper->get_ls_translations($wp_query, $_wp_query_back, $this->wp_query); // 2. determine url foreach ($w_active_languages as $k => $lang) { $skip_lang = false; if (is_singular() || isset($_wp_query_back->query['name']) && isset($_wp_query_back->query['post_type']) || !empty($this->wp_query->queried_object_id) && $this->wp_query->queried_object_id == get_option('page_for_posts')) { $this_lang_tmp = $this->this_lang; $this->this_lang = $lang['code']; $lang_page_on_front = get_option('page_on_front'); $lang_page_for_posts = get_option('page_for_posts'); if ($lang_page_on_front) { $lang_page_on_front = icl_object_id($lang_page_on_front, 'page', false, $lang['code']); } if ($lang_page_for_posts) { $lang_page_for_posts = icl_object_id($lang_page_for_posts, 'page', false, $lang['code']); } if ('page' === get_option('show_on_front') && !empty($translations[$lang['code']]) && $translations[$lang['code']]->element_id == $lang_page_on_front) { $lang['translated_url'] = $this->language_url($lang['code']); } elseif ('page' == get_option('show_on_front') && !empty($translations[$lang['code']]) && $translations[$lang['code']]->element_id && $translations[$lang['code']]->element_id == $lang_page_for_posts) { if ($lang_page_for_posts) { $lang['translated_url'] = get_permalink($lang_page_for_posts); } else { $lang['translated_url'] = $this->language_url($lang['code']); } } else { if (!empty($translations[$lang['code']]) && isset($translations[$lang['code']]->post_title)) { $lang['translated_url'] = get_permalink($translations[$lang['code']]->element_id); $lang['missing'] = 0; } else { if ($icl_lso_link_empty) { if (!empty($template_args['link_empty_to'])) { $lang['translated_url'] = str_replace('{%lang}', $lang['code'], $template_args['link_empty_to']); } else { $lang['translated_url'] = $this->language_url($lang['code']); } } else { $skip_lang = true; } $lang['missing'] = 1; } } $this->this_lang = $this_lang_tmp; } elseif (is_category() || is_tax() || is_tag()) { global $icl_adjust_id_url_filter_off; $icl_adjust_id_url_filter_off = true; list($lang, $skip_lang) = $languages_helper->add_tax_url_to_ls_lang($lang, $translations, $icl_lso_link_empty, $skip_lang); $icl_adjust_id_url_filter_off = false; } elseif (is_author()) { global $authordata; if (empty($authordata)) { $authordata = get_userdata(get_query_var('author')); } remove_filter('home_url', array($this, 'home_url'), 1, 4); remove_filter('author_link', array($this, 'author_link')); list($lang, $skip_lang) = $languages_helper->add_author_url_to_ls_lang($lang, $authordata, $icl_lso_link_empty, $skip_lang); add_filter('home_url', array($this, 'home_url'), 1, 4); add_filter('author_link', array($this, 'author_link')); } elseif (is_archive() && !is_tag()) { global $icl_archive_url_filter_off; $icl_archive_url_filter_off = true; remove_filter('post_type_archive_link', array($this, 'post_type_archive_link_filter'), 10); list($lang, $skip_lang) = $languages_helper->add_date_or_cpt_url_to_ls_lang($lang, $this->wp_query, $icl_lso_link_empty, $skip_lang); add_filter('post_type_archive_link', array($this, 'post_type_archive_link_filter'), 10, 2); $icl_archive_url_filter_off = false; } elseif (is_search()) { $url_glue = strpos($this->language_url($lang['code']), '?') === false ? '?' : '&'; $lang['translated_url'] = $this->language_url($lang['code']) . $url_glue . 's=' . urlencode($wp_query->query['s']); } else { global $icl_language_switcher_preview; if ($icl_lso_link_empty || is_home() || is_404() || 'page' === get_option('show_on_front') && ($this->wp_query->queried_object_id == get_option('page_on_front') || $this->wp_query->queried_object_id == get_option('page_for_posts')) || $icl_language_switcher_preview || WPML_Root_Page::is_current_request_root()) { $lang['translated_url'] = $this->language_url($lang['code']); $skip_lang = false; } else { $skip_lang = true; unset($w_active_languages[$k]); } } if (!$skip_lang) { $w_active_languages[$k] = $lang; } else { unset($w_active_languages[$k]); } } // 3. foreach ($w_active_languages as $k => $v) { $w_active_languages[$k] = $languages_helper->get_ls_language($k, $current_language, $w_active_languages[$k]); } // 4. pass GET parameters $parameters_copied = apply_filters('icl_lang_sel_copy_parameters', array_map('trim', explode(',', wpml_get_setting_filter('', 'icl_lang_sel_copy_parameters')))); if ($parameters_copied) { foreach ($_GET as $k => $v) { if (in_array($k, $parameters_copied)) { $gets_passed[$k] = $v; } } } if (!empty($gets_passed)) { $gets_passed = http_build_query($gets_passed); foreach ($w_active_languages as $code => $al) { if (empty($al['missing'])) { $glue = false !== strpos($w_active_languages[$code]['url'], '?') ? '&' : '?'; $w_active_languages[$code]['url'] .= $glue . $gets_passed; } } } // restore current $wp_query unset($wp_query); global $wp_query; // make it global again after unset $wp_query = clone $_wp_query_back; unset($_wp_query_back); $w_active_languages = apply_filters('icl_ls_languages', $w_active_languages); $w_active_languages = $languages_helper->sort_ls_languages($w_active_languages, $template_args); // Change the url, in case languages in subdomains are set. if ($this->settings['language_negotiation_type'] == 2) { foreach ($w_active_languages as $lang => $element) { $w_active_languages[$lang]['url'] = $this->convert_url($element['url'], $lang); } } wp_reset_query(); wp_cache_set($cache_key, $w_active_languages, $cache_group); return $w_active_languages; }
/** * Try to parse the URL to find a related post or term * * @param string $url * @param string $lang_code * * @return string|bool */ private function resolve_object_url($url, $lang_code) { global $sitepress, $wp_query, $wpml_term_translations, $wpml_post_translations; // todo: pass as a dependencies $this->resolving_url = true; $new_url = false; $cache_key = md5($url); $cache_group = 'resolve_object_url'; $cache_found = false; $cache = new WPML_WP_Cache($cache_group); $translations = $cache->get($cache_key, $cache_found); if (!$cache_found && is_object($wp_query)) { $sitepress->set_wp_query(); // Make sure $sitepress->wp_query is set $_wp_query_back = clone $wp_query; unset($wp_query); global $wp_query; // make it global again after unset $tmp_wp_query = $sitepress->get_wp_query(); $wp_query = is_object($tmp_wp_query) ? clone $tmp_wp_query : clone $_wp_query_back; unset($tmp_wp_query); $languages_helper = new WPML_Languages($wpml_term_translations, $sitepress, $wpml_post_translations); list($translations, $wp_query) = $languages_helper->get_ls_translations($wp_query, $_wp_query_back, $sitepress->get_wp_query()); // restore current $wp_query unset($wp_query); global $wp_query; // make it global again after unset $wp_query = clone $_wp_query_back; unset($_wp_query_back); $cache->set($cache_key, $translations); } if ($translations && isset($translations[$lang_code]->element_type)) { $current_lang = $sitepress->get_current_language(); $sitepress->switch_lang($lang_code); $element = explode('_', $translations[$lang_code]->element_type); $type = array_shift($element); $subtype = implode('_', $element); switch ($type) { case 'post': $new_url = get_permalink($translations[$lang_code]->element_id); break; case 'tax': $term = get_term($translations[$lang_code]->element_id, $subtype); $new_url = get_term_link($term); break; } $sitepress->switch_lang($current_lang); } $this->resolving_url = false; return $new_url; }