<?php class WPML_Lang_Parameter_Converter extends WPML_URL_Converter { /** * WPML_Lang_Parameter_Converter constructor. * * @param string $default_language * @param array $active_languages */ public function __construct( $default_language, $active_languages ) { parent::__construct( $default_language, $active_languages ); add_filter( 'request', array( $this, 'request_filter' ) ); add_filter( 'get_pagenum_link', array( $this, 'paginated_url_filter' ) ); add_filter( 'wp_link_pages_link', array( $this, 'paginated_link_filter' ) ); } function request_filter( $request ) { if ( !defined( 'WP_ADMIN' ) && isset( $request[ 'lang' ] ) ) { // Count the parameters that have settings and remove our 'lang ' setting it's the only one. // This is required so that home page detection works for other languages. $count = 0; foreach ( $request as $data ) { if ( $data !== '' ) { $count += 1; } } if ( $count == 1 ) { unset( $request[ 'lang' ] ); } } return $request; } /** * Filters the pagination links on taxonomy archives to properly have the language parameter after the URI. * * @param string $url * * @return string */ function paginated_url_filter( $url ) { $parts = explode( '?', $url ); $last_part = count( $parts ) > 2 ? array_pop( $parts ) : ""; $url = join( '?', $parts ); $url = preg_replace( '#(.+?)(/\?|\?)(.*?)(/.+?[/$|$])$#', '$1$4$5?$3', $url ); $url = preg_replace( '#(\?.+)(%2F|\/)$#', '$1', $url ); return $url . ( $last_part !== "" && strpos( $url, '?' . $last_part ) === false ? '&' . $last_part : '' ); } /** * Filters the pagination links on paginated posts and pages, acting on the links html * output containing the anchor tag the link is a property of. * * @param string $link_html * * @return string * * @hook wp_link_pages_link */ function paginated_link_filter( $link_html ) { return preg_replace('#"([^"].+?)(/\?|\?)(.+)(/\d/)"#', '"$1$4?$3"', $link_html); } protected function get_lang_from_url_string( $url ) { return $this->lang_by_param ( $url, false ); } protected function convert_url_string( $source_url, $lang_code ) { $old_lang_code = $this->get_lang_from_url_string ( $source_url ); $lang_code = (bool) $lang_code === false ? $this->default_language : $lang_code; $lang_code = $lang_code === $this->default_language ? "" : $lang_code; if ( (bool) $old_lang_code !== false ) { $replace = $lang_code === "" ? "" : '?lang=' . $lang_code; $source_url = str_replace ( '?lang=' . $old_lang_code, $replace, $source_url ); $replace = str_replace ( '?', '&', $replace ); $source_url = str_replace ( '&lang=' . $old_lang_code, $replace, $source_url ); $source_url = strpos($source_url, '?') === false ? $source_url . '?lang=' . $lang_code : $source_url; } if ( strpos ( $source_url, 'lang=' . $lang_code ) === false ) { $source_url .= ( strpos ( $source_url, '?' ) === false ? '?' : '&' ) . 'lang=' . $lang_code; } $source_url = str_replace ( '?lang=&', '?', $source_url ); $source_url = str_replace ( '&lang=&', '&', $source_url ); $source_url = str_replace ( '&lang=/', '', trailingslashit ( $source_url ) ); $source_url = str_replace ( '?lang=/', '', $source_url ); $source_url = str_replace ( '//?', '/?', $source_url ); return untrailingslashit ( $source_url ); } }