/** * Ask for specific translations with arguments. * * * @see prepare_translation_arguments() * @param array $args { * * Optional. If left out, some magic happens. * * @type int $site_id Base site * @type int $content_id post or term_taxonomy ID, *not* term ID * @type string $type @see Mlp_Language_Api::get_request_type() * @type bool $strict When TRUE (default) only matching exact * translations will be included * @type string $search_term If you want to translate a search * @type string $post_type For post type archives * @type bool $include_base Include the base site in returned list * * } * @return array Array of Mlp_Translation instances, site IDs are the keys */ public function get_translations(array $args = array()) { /** @type WP_Rewrite $wp_rewrite */ global $wp_rewrite; $arguments = $this->prepare_translation_arguments($args); $key = md5(serialize($arguments)); $content_relations = array(); $cached = wp_cache_get($key, 'mlp'); if (is_array($cached)) { return $cached; } $sites = $this->get_related_sites($arguments['site_id'], $arguments['include_base']); if (empty($sites)) { return array(); } if (!empty($arguments['content_id'])) { // array with site_ids as keys, content_ids as values $content_relations = $this->get_related_content_ids($arguments['site_id'], $arguments['content_id'], $arguments['type']); if (empty($content_relations) && $arguments['strict']) { return array(); } } $translations = array(); $languages = $this->get_all_language_data(); foreach ($sites as $site_id) { if (!isset($languages[$site_id])) { continue; } $translations[$site_id] = array('source_site_id' => $arguments['site_id'], 'target_site_id' => $site_id, 'type' => $arguments['type'], 'target_content_id' => 0, 'target_title' => ''); } reset($translations); foreach ($translations as $site_id => &$arr) { $valid = TRUE; if (!empty($content_relations[$site_id])) { $content_id = $content_relations[$site_id]; $arr['target_content_id'] = $content_id; if ('term' === $arguments['type']) { $term_translation = new Mlp_Term_Translation($this->wpdb, $wp_rewrite); $translation = $term_translation->get_translation($content_id, $site_id); if (!$translation) { $valid = FALSE; } else { $arr = array_merge($arr, $translation); } } elseif ('post' === $arguments['type']) { switch_to_blog($site_id); $translation = $this->get_post_translation($content_relations[$site_id], $arguments['strict']); if (!$translation) { $valid = FALSE; } else { $arr = array_merge($arr, $translation); } restore_current_blog(); } } else { switch_to_blog($site_id); if ('search' === $arguments['type']) { $url = get_search_link($arguments['search_term']); $arr['target_url'] = new Mlp_Url($url); } elseif ('post_type_archive' === $arguments['type'] && !empty($arguments['post_type'])) { $translation = $this->get_post_type_archive_translation($arguments['post_type']); $arr = array_merge($arr, $translation); } // Nothing found, use fallback if allowed if (empty($arr['target_url']) && !$arguments['strict'] || 'front_page' === $arguments['type']) { $arr['target_url'] = get_site_url($site_id, '/'); } if (empty($arr['target_url'])) { $valid = FALSE; } restore_current_blog(); } if (!$valid) { unset($translations[$site_id]); continue; } $data = $languages[$site_id]; if (!isset($data['http_name'])) { if (isset($data['lang'])) { $data['http_name'] = $data['lang']; } else { $data['http_name'] = ''; } } if ('' !== $data['http_name']) { $arr['icon'] = $this->get_flag_by_language($data['http_name'], $site_id); } $arr = new Mlp_Translation($arr, new Mlp_Language($data)); } /** * Filter list of translations before they are used. * * @param array $translations Prepared translations * @param array $arguments Prepared arguments */ $translations = apply_filters('mlp_translations', $translations, $arguments); wp_cache_set($key, $translations, 'mlp'); return $translations; }
/** * Ask for specific translations with arguments. * * * @see prepare_translation_arguments() * * @param array $args { * * Optional. If left out, some magic happens. * * @type int $site_id Base site * @type int $content_id post or term_taxonomy ID, *not* term ID * @type string $type @see Mlp_Language_Api::get_request_type() * @type bool $strict When TRUE (default) only matching exact * translations will be included * @type string $search_term If you want to translate a search * @type string $post_type For post type archives * @type bool $include_base Include the base site in returned list * * } * @return Translation[] Array of Mlp_Translation instances, site IDs are the keys */ public function get_translations(array $args = []) { $arguments = $this->prepare_translation_arguments($args); $key = md5(serialize($arguments)); $cached = wp_cache_get($key, 'mlp'); if (is_array($cached)) { return $cached; } $sites = $this->site_relations->get_related_site_ids($arguments['site_id'], $arguments['include_base']); if (empty($sites)) { return []; } $content_relations = []; if (!empty($arguments['content_id'])) { // array with site_ids as keys, content_ids as values $content_relations = $this->content_relations->get_relations($arguments['site_id'], $arguments['content_id'], $arguments['type']); if (empty($content_relations) && $arguments['strict']) { return []; } } $translations = []; $languages = $this->get_all_language_data(); foreach ($sites as $site_id) { if (!isset($languages[$site_id])) { continue; } $translations[$site_id] = ['remote_title' => '', 'source_site_id' => $arguments['site_id'], 'target_site_id' => $site_id, 'target_content_id' => 0, 'type' => $arguments['type']]; } reset($translations); /** @type WP_Rewrite $wp_rewrite */ global $wp_rewrite; foreach ($translations as $site_id => &$arr) { $valid = TRUE; if (!empty($content_relations[$site_id])) { $content_id = $content_relations[$site_id]; $arr['target_content_id'] = $content_id; if ('term' === $arguments['type']) { $term_translation = new Mlp_Term_Translation($this->wpdb, $wp_rewrite, $this->type_factory); $translation = $term_translation->get_translation($content_id, $site_id); if (!$translation) { $valid = FALSE; } else { $arr = array_merge($arr, $translation); } } elseif ('post' === $arguments['type']) { switch_to_blog($site_id); $translation = $this->get_post_translation($content_relations[$site_id], $arguments['strict']); if (!$translation) { $valid = FALSE; } else { $arr = array_merge($arr, $translation); } restore_current_blog(); } } else { switch_to_blog($site_id); if ('search' === $arguments['type']) { $arr['remote_url'] = $this->type_factory->create_url([get_search_link($arguments['search_term'])]); } elseif ('post_type_archive' === $arguments['type'] && !empty($arguments['post_type'])) { $translation = $this->get_post_type_archive_translation($arguments['post_type']); $arr = array_merge($arr, $translation); } // Nothing found, use fallback if allowed if (empty($arr['remote_url']) && !$arguments['strict'] || 'front_page' === $arguments['type']) { $arr['remote_url'] = $this->type_factory->create_url([get_site_url($site_id, '/')]); } if (empty($arr['remote_url'])) { $valid = FALSE; } restore_current_blog(); } if (!$valid) { unset($translations[$site_id]); continue; } $data = $languages[$site_id]; if (!isset($data['http_name'])) { if (isset($data['lang'])) { $data['http_name'] = $data['lang']; } else { $data['http_name'] = ''; } } if ('' !== $data['http_name']) { $arr['icon_url'] = \Inpsyde\MultilingualPress\get_flag_url_for_site($site_id); } else { $arr['icon_url'] = $this->type_factory->create_url(['']); } $arr['suppress_filters'] = $arguments['suppress_filters']; $arr = $this->type_factory->create_translation([$arr, $this->type_factory->create_language([$data])]); } /** * Filter the translations before they are used. * * @param Translation[] $translations Translations. * @param array $arguments Translation arguments. */ $translations = apply_filters('mlp_translations', $translations, $arguments); wp_cache_set($key, $translations, 'mlp'); // TODO: In deprecated class, add "target_*" aliases for elements in $translations with "remote_*" keys. return $translations; }