true), 'names'); $post = get_page_by_path($path, OBJECT, $post_types); if ($post instanceof WP_Post) { unset($query_vars['pagename'], $query_vars['name'], $query_vars['page_id']); if ('page' === $post->post_type) { $query_vars['pagename'] = $path; } else { $query_vars['name'] = $post->post_name; $query_vars['post_type'] = $post->post_type; } return $query_vars; } if (isset($query_vars['pagename'])) { $parts = explode('/', (string) $query_vars['pagename']); if (isset($parts[0]) && AITMT_Languages::normalize_code($parts[0]) === $language) { array_shift($parts); $query_vars['pagename'] = implode('/', $parts); } } return $query_vars; } public static function current_language(): string { $source = AITMT_Settings::source_language(); $enabled = AITMT_Languages::enabled_with_source(); $query_var = get_query_var('AITMT_lang'); if ($query_var) { $language = AITMT_Languages::normalize_code((string) $query_var); if (in_array($language, $enabled, true)) { return $language; } } // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Public language switching is a read-only GET action. if ('query' === AITMT_Settings::get('url_mode', 'directory') && isset($_GET['lang'])) { $language = AITMT_Languages::normalize_code(sanitize_key(wp_unslash((string) $_GET['lang']))); if (in_array($language, $enabled, true)) { return $language; } } // phpcs:enable WordPress.Security.NonceVerification.Recommended if ('directory' === AITMT_Settings::get('url_mode', 'directory')) { $language = self::language_from_path(); if ($language && in_array($language, $enabled, true)) { return $language; } } return $source; } public static function language_from_path(): string { $request_uri = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash((string) $_SERVER['REQUEST_URI'])) : '/'; $path = (string) wp_parse_url($request_uri, PHP_URL_PATH); $home_path = (string) wp_parse_url(home_url('/'), PHP_URL_PATH); $relative = self::strip_home_path($path, $home_path); $segments = array_values(array_filter(explode('/', trim($relative, '/')))); return isset($segments[0]) ? AITMT_Languages::normalize_code($segments[0]) : ''; } public static function path_without_language(): string { $request_uri = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash((string) $_SERVER['REQUEST_URI'])) : '/'; $path = (string) wp_parse_url($request_uri, PHP_URL_PATH); $home_path = (string) wp_parse_url(home_url('/'), PHP_URL_PATH); $relative = self::strip_home_path($path, $home_path); $segments = array_values(array_filter(explode('/', trim($relative, '/')))); $enabled = AITMT_Languages::enabled_with_source(); if (isset($segments[0]) && in_array(AITMT_Languages::normalize_code($segments[0]), $enabled, true)) { array_shift($segments); } return implode('/', $segments); } public static function language_url(string $language): string { $language = AITMT_Languages::normalize_code($language); $source = AITMT_Settings::source_language(); $url_mode = AITMT_Settings::get('url_mode', 'directory'); $request_uri = isset($_SERVER['REQUEST_URI']) ? sanitize_text_field(wp_unslash((string) $_SERVER['REQUEST_URI'])) : '/'; $path = (string) wp_parse_url($request_uri, PHP_URL_PATH); $query = (string) wp_parse_url($request_uri, PHP_URL_QUERY); $query_args = array(); if ('' !== $query) { wp_parse_str($query, $query_args); } unset($query_args['lang']); if ('query' === $url_mode) { $base_url = home_url(self::strip_home_path($path, (string) wp_parse_url(home_url('/'), PHP_URL_PATH))); if ($language !== $source || '1' !== AITMT_Settings::get('hide_default_language', '1')) { $query_args['lang'] = $language; } return add_query_arg($query_args, $base_url); } $home_path = (string) wp_parse_url(home_url('/'), PHP_URL_PATH); $relative = trim(self::strip_home_path($path, $home_path), '/'); $segments = array_values(array_filter(explode('/', $relative))); $all_languages = AITMT_Languages::enabled_with_source(); if (isset($segments[0]) && in_array(AITMT_Languages::normalize_code($segments[0]), $all_languages, true)) { array_shift($segments); } if ($language !== $source || '1' !== AITMT_Settings::get('hide_default_language', '1')) { array_unshift($segments, $language); } $new_path = implode('/', $segments); $url = home_url($new_path ? trailingslashit($new_path) : '/'); return add_query_arg($query_args, $url); } public static function render_hreflang() { if (is_admin() || is_feed()) { return; } foreach (AITMT_Languages::enabled_with_source() as $language) { printf( '' . "\n", esc_attr($language), esc_url(self::language_url($language)) ); } } private static function strip_home_path(string $path, string $home_path): string { $home_path = '/' . trim($home_path, '/'); if ('/' === $home_path) { return '/' . ltrim($path, '/'); } if (0 === strpos($path, $home_path)) { return '/' . ltrim(substr($path, strlen($home_path)), '/'); } return '/' . ltrim($path, '/'); } }