/** * @param array $lang * @param object|WP_User $author_data * @param bool $icl_lso_link_empty * @param bool $skip_lang * * @return array */ public function add_author_url_to_ls_lang($lang, $author_data, $icl_lso_link_empty, $skip_lang) { $post_type = get_query_var('post_type') ? get_query_var('post_type') : 'post'; if ($this->query_utils->author_query_has_posts($post_type, $author_data, $lang['code'])) { $lang['translated_url'] = $this->sitepress->convert_url($this->sitepress->get_wp_api()->get_author_posts_url($author_data->ID), $lang['code']); $lang['missing'] = 0; } else { list($lang, $skip_lang) = $this->maybe_mark_lang_missing($lang, $skip_lang, $icl_lso_link_empty); } return array($lang, $skip_lang); }
function get_ls_languages($template_args = array()) { //Returns false if is admin and settings are corrupted if (is_admin() && !SitePress::check_settings_integrity()) { return false; } /** @var $wp_query WP_Query */ global $wpdb, $wp_query, $w_this_lang, $wpml_post_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']; } // 1. Determine translations if (is_category()) { $skip_empty = false; $term_taxonomy_id_prepared = $wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy=%s", array(get_query_var('cat'), 'category')); $term_taxonomy_id = $wpdb->get_var($term_taxonomy_id_prepared); $trid = $this->get_element_trid($term_taxonomy_id, 'tax_category'); $translations = $this->get_element_translations($trid, 'tax_category', $skip_empty); } elseif (is_tag()) { $skip_empty = false; $term_taxonomy_id_prepared = $wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy=%s", array(get_query_var('tag_id'), 'post_tag')); $term_taxonomy_id = $wpdb->get_var($term_taxonomy_id_prepared); $trid = $this->get_element_trid($term_taxonomy_id, 'tax_post_tag'); $translations = $this->get_element_translations($trid, 'tax_post_tag', $skip_empty); } elseif (is_tax()) { $skip_empty = false; $term_taxonomy_id_prepared = $wpdb->prepare("SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id=%d AND taxonomy=%s", array($wp_query->get_queried_object_id(), get_query_var('taxonomy'))); $term_taxonomy_id = $wpdb->get_var($term_taxonomy_id_prepared); if ($this->is_translated_taxonomy(get_query_var('taxonomy'))) { $trid = $this->get_element_trid($term_taxonomy_id, 'tax_' . get_query_var('taxonomy')); $translations = $this->get_element_translations($trid, 'tax_' . get_query_var('taxonomy'), $skip_empty); } else { $translations[$this->get_current_language()] = (object) array('translation_id' => 0, 'language_code' => $this->get_default_language(), 'original' => 1, 'name' => get_query_var('taxonomy'), 'term_id' => $wp_query->get_queried_object_id()); } } elseif (is_archive() && !empty($wp_query->posts)) { $translations = array(); } elseif (is_attachment()) { // Exception for attachments. Not translated. $trid = $this->get_element_trid($wp_query->get_queried_object_id(), 'post_attachment'); $translations = $this->get_element_translations($trid, 'post_attachment'); } elseif (is_page() || 'page' == get_option('show_on_front') && (isset($this->wp_query->queried_object_id) && $this->wp_query->queried_object_id == get_option('page_on_front') || isset($this->wp_query->queried_object_id) && $this->wp_query->queried_object_id == get_option('page_for_posts'))) { $trid = $this->get_element_trid($wp_query->get_queried_object_id(), 'post_page'); $translations = $this->get_element_translations($trid, 'post_page'); } elseif (is_singular() && !empty($wp_query->posts) || isset($_wp_query_back->query['name']) && isset($_wp_query_back->query['post_type'])) { $trid = $wpml_post_translations->get_element_trid($this->wp_query->post->ID); $translations = $this->get_element_translations($trid, 'post_' . $this->wp_query->post->post_type); } else { $wp_query->is_singular = false; $wp_query->is_archive = false; $wp_query->is_category = false; $wp_query->is_404 = true; } // 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()) { if (isset($translations[$lang['code']])) { // force the taxonomy id adjustment to not modify this global $icl_adjust_id_url_filter_off; $icl_adjust_id_url_filter_off = true; $taxonomy = is_category() ? 'category' : (is_tag() ? 'post_tag' : get_query_var('taxonomy')); $lang['translated_url'] = get_term_link((int) $translations[$lang['code']]->term_id, $taxonomy); $icl_adjust_id_url_filter_off = false; // restore default behaviour $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']); } } elseif ($current_language !== $lang['code']) { // don't skip the current language $skip_lang = true; } $lang['missing'] = 1; } } elseif (is_author()) { global $authordata, $wp_query; if (empty($authordata)) { $authordata = get_userdata(get_query_var('author')); } $post_type = get_query_var('post_type') ? get_query_var('post_type') : 'post'; $query_utils = new WPML_Query_Utils(); if ($query_utils->author_query_has_posts($post_type, $authordata, $lang)) { remove_filter('home_url', array($this, 'home_url'), 1, 4); remove_filter('author_link', array($this, 'author_link')); $author_url = get_author_posts_url($authordata->ID); add_filter('home_url', array($this, 'home_url'), 1, 4); add_filter('author_link', array($this, 'author_link')); $lang['translated_url'] = $this->convert_url($author_url, $lang['code']); $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 { // dont skip the currrent language if ($current_language != $lang['code']) { $skip_lang = true; } } $lang['missing'] = 1; } } elseif (is_archive() && !is_tag()) { global $icl_archive_url_filter_off; $icl_archive_url_filter_off = true; if ($this->wp_query->is_year) { if (isset($this->wp_query->query_vars['m']) && !$this->wp_query->query_vars['year']) { $this->wp_query->query_vars['year'] = substr($this->wp_query->query_vars['m'], 0, 4); } $lang['translated_url'] = $this->archive_url(get_year_link($this->wp_query->query_vars['year']), $lang['code']); } elseif ($this->wp_query->is_month) { if (isset($this->wp_query->query_vars['m']) && !$this->wp_query->query_vars['year']) { $this->wp_query->query_vars['year'] = substr($this->wp_query->query_vars['m'], 0, 4); $this->wp_query->query_vars['monthnum'] = substr($this->wp_query->query_vars['m'], 4, 2); } 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']); } } $lang['missing'] = 1; } $lang['translated_url'] = $this->archive_url(get_month_link($this->wp_query->query_vars['year'], $this->wp_query->query_vars['monthnum']), $lang['code']); } elseif ($this->wp_query->is_day) { if (isset($this->wp_query->query_vars['m']) && !$this->wp_query->query_vars['year']) { $this->wp_query->query_vars['year'] = substr($this->wp_query->query_vars['m'], 0, 4); $this->wp_query->query_vars['monthnum'] = substr($this->wp_query->query_vars['m'], 4, 2); $this->wp_query->query_vars['day'] = substr($this->wp_query->query_vars['m'], 6, 2); gmdate('Y', current_time('timestamp')); //force wp_timezone_override_offset to be called } $lang['translated_url'] = $this->archive_url(get_day_link($this->wp_query->query_vars['year'], $this->wp_query->query_vars['monthnum'], $this->wp_query->query_vars['day']), $lang['code']); } else { if (isset($this->wp_query->query_vars['post_type'])) { do_action('_icl_before_archive_url', $this->wp_query->query_vars['post_type'], $lang['code']); if ($this->is_translated_post_type($this->wp_query->query_vars['post_type']) && function_exists('get_post_type_archive_link')) { remove_filter('post_type_archive_link', array($this, 'post_type_archive_link_filter'), 10); $post_type = $this->wp_query->query_vars['post_type']; $url = $this->convert_url(get_post_type_archive_link($post_type), $lang['code']); $lang['translated_url'] = $this->adjust_cpt_in_url($url, $post_type, $lang['code']); } else { if ($k != $this->get_default_language()) { $skip_lang = true; unset($w_active_languages[$k]); } } do_action('_icl_after_archive_url', $this->wp_query->query_vars['post_type'], $lang['code']); } } 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]); } } $languages_helper = new WPML_Languages(); // 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; }