Beispiel #1
0
 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;
 }