lang = $this->sitepress->get_current_language(); if ( ! $this->taxonomies_query ) { $this->taxonomies_query = new WPML_WP_Taxonomy_Query( $this->sitepress->get_wp_api() ); } $home = rtrim( $this->sitepress->get_wp_api()->get_option( 'home' ), '/' ); $parts = parse_url( $home ); $abshome = $parts[ 'scheme' ] . '://' . $parts[ 'host' ]; $path = isset( $parts[ 'path' ] ) ? ltrim( $parts[ 'path' ], '/' ) : ''; $tx_qvs = join( '|', $this->taxonomies_query->get_query_vars() ); $reg_ex = '@]+)?href="((' . $abshome . ')?/' . $path . '/?\?(p|page_id|cat_ID|' . $tx_qvs . ')=([0-9a-z-]+))(#?[^"]*)"([^>]+)?>@i'; $text = preg_replace_callback( $reg_ex, array( $this, 'show_permalinks_cb' ), $text ); return $text; } function show_permalinks_cb( $matches ) { $parts = $this->get_found_parts( $matches ); $url = $this->get_url( $parts ); if ( $this->sitepress->get_wp_api()->is_wp_error( $url ) || empty( $url ) ) { return $parts->whole; } $fragment = $this->get_fragment( $url, $parts ); if ( 'widget_text' == $this->sitepress->get_wp_api()->current_filter() ) { $url = $this->sitepress->convert_url( $url ); } return 'pre_href . 'href="' . $url . $fragment . '"' . $parts->trail . '>'; } private function get_found_parts( $matches ) { return (object) array( 'whole' => $matches[0], 'pre_href' => $matches[1], 'content_type' => $matches[4], 'id' => $matches[5], 'fragment' => $matches[6], 'trail' => isset( $matches[7] ) ? $matches[7] : '' ); } private function get_url( $parts ) { $tax = $this->taxonomies_query->find( $parts->content_type ); $auto_adjust_ids_origin = $this->sitepress->get_setting( 'auto_adjust_ids', false ); $this->sitepress->set_setting( 'auto_adjust_ids', true ); if ( $parts->content_type == 'cat_ID' ) { $url = $this->sitepress->get_wp_api()->get_category_link( $parts->id ); } elseif ( $tax ) { $url = $this->sitepress->get_wp_api()->get_term_link( $parts->id, $tax ); } else { $url = $this->sitepress->get_wp_api()->get_permalink( $parts->id ); } $this->sitepress->set_setting( 'auto_adjust_ids', $auto_adjust_ids_origin ); return $url; } private function get_fragment( $url, $parts ) { $fragment = $parts->fragment; $fragment = $this->remove_query_in_wrong_lang( $fragment ); if ( $fragment != '' ) { $fragment = str_replace( '&', '&', $fragment ); $fragment = str_replace( '&', '&', $fragment ); if ( $fragment[ 0 ] == '&' ) { if ( strpos( $fragment, '?' ) === false && strpos( $url, '?' ) === false ) { $fragment[ 0 ] = '?'; } } if ( strpos( $url, '?' ) ) { $fragment = $this->check_for_duplicate_lang_query( $fragment, $url ); } } return $fragment; } private function remove_query_in_wrong_lang( $fragment ) { if ( $fragment != '' ) { $fragment = str_replace( '&', '&', $fragment ); $fragment = str_replace( '&', '&', $fragment ); $start = $fragment[0]; parse_str( substr( $fragment, 1 ), $fragment_query ); if ( isset( $fragment_query['lang' ] ) ) { if ( $fragment_query['lang'] != $this->lang ) { unset( $fragment_query['lang'] ); $fragment = build_query( $fragment_query ); if ( strlen( $fragment ) ) { $fragment = $start . $fragment; } } } } return $fragment; } private function check_for_duplicate_lang_query( $fragment , $url ) { $url_parts = explode( '?', $url ); parse_str( $url_parts[1], $url_query ); if ( isset( $url_query['lang'] ) ) { parse_str( substr( $fragment, 1 ), $fragment_query ); if ( isset( $fragment_query['lang' ] ) ) { unset( $fragment_query['lang'] ); $fragment = build_query( $fragment_query ); if ( strlen( $fragment ) ) { $fragment = '&' . $fragment; } } } return $fragment; } }