?(\(\/\(\.\*\)\)\?\/\?\$)/', '$1' . $endpoint_translation . '$2$3', $k ); $buff_value[ $k ] = $v; } $value = $buff_value; } } } return $value; } /** * @param string $link * @param int $pid * * @return string */ public function endpoint_permalink_filter( $link, $pid ) { global $post, $wp; if ( isset( $post->ID ) && $post->ID && ! is_admin() ) { $page_lang = $this->post_translations->get_element_lang_code( $post->ID ); if ( ! $page_lang ) { return $link; } if ( $pid === $post->ID ) { $pid_in_page_lang = $pid; } else { $translations = $this->post_translations->get_element_translations( $pid ); $pid_in_page_lang = isset( $translations[ $page_lang ] ) ? $translations[ $page_lang ] : $pid; } $current_lang = apply_filters( 'wpml_current_language', $this->current_language ); if ( ( $current_lang != $page_lang && $pid_in_page_lang == $post->ID ) || apply_filters( 'wpml_endpoint_force_permalink_filter', false, $current_lang, $page_lang ) ) { $endpoints = $this->get_registered_endpoints(); foreach ( $endpoints as $key => $endpoint ) { if ( isset( $wp->query_vars[ $key ] ) ) { list( $link, $endpoint ) = apply_filters( 'wpml_endpoint_permalink_filter', array( $link, $endpoint ), $key ); $link = $this->get_endpoint_url( $this->get_endpoint_translation( $key, $endpoint, $current_lang ), $wp->query_vars[ $key ], $link, $page_lang ); } } } } return esc_url_raw( $link ); } /** * @param string $endpoint * @param string $value * @param string $permalink * @param bool|string $page_lang * * @return string */ public function get_endpoint_url( $endpoint, $value = '', $permalink = '', $page_lang = false ) { $value = apply_filters( 'wpml_endpoint_url_value', $value, $page_lang ); // Escape the value to prevent XSS attacks. $value = wp_kses_normalize_entities( $value ); $value = str_replace( '&', '&', $value ); $value = str_replace( "'", ''', $value ); if ( get_option( 'permalink_structure' ) ) { $query_string = ''; if ( strstr( $permalink, '?' ) ) { $query_string = '?' . parse_url( $permalink, PHP_URL_QUERY ); $permalink = current( explode( '?', $permalink ) ); } $url = trailingslashit( $permalink ) . $endpoint . '/' . $value . $query_string; } else { $url = add_query_arg( $endpoint, $value, $permalink ); } return esc_url_raw( $url ); } /** * @param string $url * @param array $data * * @return string */ public function add_endpoint_to_current_ls_language_url( $url, $data ) { global $post; $post_lang = ''; $current_endpoint = array(); if ( isset( $post->ID ) && $post->ID ) { $post_lang = $this->post_translations->get_element_lang_code( $post->ID ); $current_endpoint = $this->get_current_endpoint( $data['code'] ); if ( $post_lang === $data['code'] && $current_endpoint ) { $url = $this->get_endpoint_url( $current_endpoint['key'], $current_endpoint['value'], $url ); } } $url = apply_filters( 'wpml_current_ls_language_url_endpoint', $url, $post_lang, $data, $current_endpoint ); return esc_url_raw( $url ); } /** * @return array */ public function get_registered_endpoints() { global $wp_rewrite; $endpoints = empty( $wp_rewrite->endpoints ) ? [] : $wp_rewrite->endpoints; /** * @param array $endpoints * * @return array * * @deprecated since 4.6, use `wpml_registered_endpoints` instead. */ $endpoints = apply_filters( 'option_wpml_registered_endpoints', array_filter( wp_list_pluck( $endpoints, 2, 1 ) ) ); /** * Filter the endpoints that WPML will handle. * * @param array $endpoints * * @return array * * @since 4.6 */ return apply_filters( 'wpml_registered_endpoints', $endpoints ); } /** * @param string $language * * @return array */ public function get_current_endpoint( $language ) { global $wp; $current_endpoint = array(); foreach ( $this->get_registered_endpoints() as $key => $value ) { if ( isset( $wp->query_vars[ $key ] ) ) { $current_endpoint['key'] = $this->get_endpoint_translation( $key, $value, $language ); $current_endpoint['value'] = $wp->query_vars[ $key ]; break; } } return $current_endpoint; } }