get_settings(); $this->trp_settings = $settings; $this->translatepress_renderer = new \TRP_Translation_Render( $settings ); $this->translatepress_url_converter = new \TRP_Url_Converter( $settings ); /** * Apply the filter if any of the attribute is not translated by translatepress. * Just add the attribute filter name in the array applied in the class ProductInfo.php */ $filters_with_param_3 = apply_filters( 'woo_feed_translatepress_attributes_filters_list', array( 'woo_feed_filter_product_title', 'woo_feed_filter_product_parent_title', 'woo_feed_filter_product_yoast_wpseo_title', 'woo_feed_filter_product_rank_math_title', 'woo_feed_filter_product_aioseop_title', 'woo_feed_get_google_g:color_attribute', 'woo_feed_get_google_color_attribute', 'woo_feed_get_google_g:brand_attribute', 'woo_feed_get_google_brand_attribute', 'woo_feed_get_google_size_attribute', ) ); $category = apply_filters( 'woo_feed_translatepress_attributes_filters_list', array( 'woo_feed_filter_product_categories', 'woo_feed_filter_product_primary_category' ) ); foreach ( $category as $category_filter ) { add_filter( $category_filter, array( $this, 'trp_category_translate_strings' ), 999, 3 ); } $filters_description_with_param_3 = apply_filters( 'woo_feed_translatepress_attributes_filters_list', array( 'woo_feed_filter_product_description', 'woo_feed_filter_product_description_with_html', 'woo_feed_filter_product_short_description', 'woo_feed_filter_product_yoast_wpseo_metadesc', 'woo_feed_filter_product_rank_math_description', 'woo_feed_filter_product_aioseop_description', ) ); foreach ( $filters_with_param_3 as $filter ) { add_filter( $filter, array( $this, 'trp_translate_strings' ), 999, 3 ); } foreach ( $filters_description_with_param_3 as $filter ) { add_filter( $filter, array( $this, 'trp_translate_strings' ), 999, 3 ); } // add_filter( 'woo_feed_filter_product_categories', array( $this, 'trp_category_translate_strings' ), 999, 3 ); /** * Apply the filter if any of the attribute is not translated by translatepress. * Just add the attribute filter name in the array applied in the class ProductInfo.php */ $urls = apply_filters( 'woo_feed_translatepress_attributes_url_list', array( 'woo_feed_filter_product_yoast_canonical_url', 'woo_feed_filter_product_rank_math_canonical_url', 'woo_feed_filter_product_aioseop_canonical_url', 'woo_feed_filter_product_link', 'woo_feed_filter_product_parent_link', 'woo_feed_filter_product_canonical_link', 'woo_feed_filter_product_ex_link', 'woo_feed_filter_product_add_to_cart_link', ) ); foreach ( $urls as $filter ) { add_filter( $filter, array( $this, 'get_tp_translate_url' ), 999, 3 ); } } /** * Get the translated string. * * @param string $output The output string. * @param \WC_Product $product The product object. * @param \CTXFeed\V5\Utility\Config $config The config object. * * @return string */ public function get_tp_translate( $output, $product, $config ) { // phpcs:ignore return $this->translate_string( $output, $config, $product ); } /** * Get the translated string. * * @param string $output The output string. * @param \WC_Product $product The product object. * @param \CTXFeed\V5\Utility\Config $config The config object. * * @return string */ public function get_tp_translate_for_description( $output, $product, $config ) { // phpcs:ignore return $this->translate_desc_string( $output, $config, $product ); } /** * Get the translated string. * * @param string $output The output string. * @param \CTXFeed\V5\Utility\Config $config The config object. * @param \WC_Product $product The product object. * * @return string */ public function translate_string( $output, $config, $product ) { // phpcs:ignore global $wpdb; $feed_language = $config->get_feed_language(); $table_name = $wpdb->prefix . 'trp_dictionary_' . strtolower( $this->trp_settings['default-language'] ) . '_' . strtolower( $feed_language ); /** * If the feed language is same as the default language or the table does not exist then return the output. * If the table does not exist then it means the language is not translated. * If the feed language is same as the default language then it means the language is not translated. */ if ( ! $feed_language || $feed_language === $this->trp_settings['default-language'] || ! $this->table_exists( $table_name ) ) { return $output; } if ( $this->translatepress_renderer ) { // Remove empty strings. $translatable_strings = self::get_translatable_strings( $output ); $translatable_strings = array_values( $translatable_strings ); $translated_strings = array(); foreach ( $translatable_strings as $string ) { // phpcs:ignore // Prepare the SQL query // phpcs:ignore $query = $wpdb->prepare( // phpcs:ignore "SELECT translated, MATCH (original) AGAINST (%s IN NATURAL LANGUAGE MODE) AS score FROM {$table_name} WHERE `original`= %s AND status != 0 LIMIT 1", $string, $string ); // phpcs:ignore // Execute the query $result = $wpdb->get_results( $query ); // phpcs:ignore // Check if there is a result and if it has a translated string if ( ! count( $result ) || ! isset( $result[0]->translated ) || trim( $result[0]->translated ) === '' ) { continue; } $translated_strings[] = $result[0]->translated; } // If the translated strings array is not empty then implode the array with space. if ( count( $translated_strings ) ) { $output = implode( ' ', $translated_strings ); } } return $output; } /** * Get the translated string. * * @param string $output The output string. * @param \CTXFeed\V5\Utility\Config $config The config object. * @param \WC_Product $product The product object. * * @return string */ public function translate_desc_string( $output, $config, $product ) { // phpcs:ignore global $wpdb; $feed_language = $config->get_feed_language(); $table_name = $wpdb->prefix . 'trp_dictionary_' . strtolower( $this->trp_settings['default-language'] ) . '_' . strtolower( $feed_language ); /** * If the feed language is same as the default language or the table does not exist then return the output. * If the table does not exist then it means the language is not translated. * If the feed language is same as the default language then it means the language is not translated. */ if ( ! $feed_language || $feed_language === $this->trp_settings['default-language'] || ! $this->table_exists( $table_name ) || $output == '' ) { return $output; } $translated_strings_new = []; if ( $this->translatepress_renderer ) { // Remove empty strings. $product_id = $product->get_id(); $trp_original_meta_ids_sql = $wpdb->prepare( // phpcs:ignore "SELECT `original_id` FROM `{$wpdb->prefix}trp_original_meta` WHERE `meta_key` = %s AND `meta_value` = %d ORDER BY `meta_id` ASC", 'post_parent_id', $product_id ); $trp_original_meta_ids = $wpdb->get_results( $trp_original_meta_ids_sql, ARRAY_A ); // phpcs:ignore if ( count( $trp_original_meta_ids ) ) { $ids = array(); foreach ( $trp_original_meta_ids as $value ) { array_push( $ids, $value['original_id'] ); } if ( count( $ids ) < 1 ) { return $output; } $ids_str = implode( ', ', $ids ); $trp_dictionary_sql = "SELECT `original`,`translated` FROM {$table_name} WHERE `original_id` IN ({$ids_str})"; $trp_dictionary_strings = $wpdb->get_results( $trp_dictionary_sql ); // phpcs:ignore $translated_strings_new = array(); foreach ( $trp_dictionary_strings as $key => $string ) { if ( $string->translated === '' ) { $translated_strings_new[] = $string->original; } else { $translated_strings_new[] = $string->translated; } } } else { $translated_strings_new[] = $this->translate_string( $output, $config, $product ); } // If the translated strings array is not empty then implode the array with space. if ( count( $translated_strings_new ) ) { $output = implode( ' ', $translated_strings_new ); } } return $output; } /** * Get the translated string. * * @param string $output The output string. * @param \WC_Product $product The product object. * @param \CTXFeed\V5\Utility\Config $config The config object. * * @return string */ public function trp_translate_strings( $output, $product, $config ) { // phpcs:ignore if($config->get_feed_language()!='en_US') { $output = str_replace(' - ', ' – ', $output); $output = str_replace("'", '’', $output); $output = preg_replace('/(\d)x(\d)/', '$1×$2', $output); } $original_output = $output; $strings = self::get_translatable_strings( $output ); $strings = array_map( 'trp_full_trim', $strings ); $translated_strings_new = $this->translatepress_renderer->process_strings( array_values( $strings ), $config->get_feed_language() ); // If the translated strings array is not empty then implode the array with space. if ( count( $translated_strings_new ) ) { $output = implode( ' ', $translated_strings_new ); $output = trim( $output ); } if ( $output == '' ) { $output = $original_output; } return $output; } public function trp_category_translate_strings( $output, $product, $config ) { // phpcs:ignore $original_output = $output; $genreArray = explode(">", $output); if( is_array( $genreArray ) && count( $genreArray )> 0 ){ $translated = []; foreach ( $genreArray as $values ){ $strings = self::get_translatable_strings( $values ); $strings = array_map( 'trp_full_trim', $strings ); $translated_strings_new = $this->translatepress_renderer->process_strings( array_values( $strings ), $config->get_feed_language() ); // If the translated strings array is not empty then implode the array with space. $get_output = ''; if ( is_array( $translated_strings_new ) && count( $translated_strings_new ) ) { $values = implode( ' ', $translated_strings_new ); $values = trim( $values ); } $translated[] = $values; } if( count( $translated )){ $output = implode(" > ", $translated ); } } if ( $output == '' ) { $output = $original_output; } return $output; } /** * Get the translated string. * * @param string $output The output string. * @param \WC_Product $product The product object. * @param \CTXFeed\V5\Utility\Config $config The config object. * * @return string */ public function get_tp_translate_url( $output, $product, $config ) { // phpcs:ignore $link = $product->get_permalink(); $feed_language = $config->get_feed_language(); $settings = get_option( 'trp_settings', false ); if( is_array( $settings ) && isset( $settings['url-slugs'][ $feed_language ] ) && is_array( $settings['url-slugs'] ) ){ $url_slug = $settings['url-slugs'][ $feed_language ]; $trp = TRP_Translate_Press::get_trp_instance(); $url_converter = $trp->get_component( 'url_converter' ); $link = $url_converter->get_url_for_language( $feed_language, $link ); // if ( $settings['default-language'] != $feed_language ) { // $link = str_replace( home_url() . '/', home_url() . '/' . $url_slug . '/', $link ); // } } $link = $this->add_utm_tracker( $link, $config ); return $link; } /** * Check if the url should be modified. * * @param string $feed_language The feed language. * * @return bool */ private function should_modify_url( $feed_language ) { global $TRP_LANGUAGE;// phpcs:ignore return $feed_language !== $TRP_LANGUAGE;// phpcs:ignore } /** * Get the modified url with the slug if the url is not translated. * * @param string $output The output string. * @param string $feed_language The feed language. * * @return string */ private function get_modified_url( $output, $feed_language ) { $exploded_output = explode( home_url(), $output ); $slug = $this->get_url_slug( $feed_language ); // If the url is not translated then add the slug at the end of the url. if ( is_array( $exploded_output ) && count( $exploded_output ) > 1 && false === strpos( $exploded_output[1], $slug ) ) { $output = home_url() . $this->get_url_slug( $feed_language ) . $exploded_output[1]; } return $output; } /** * Get the url slug for the feed language. * * @param string $feed_language The feed language. * * @return string */ private function get_url_slug( $feed_language ) { $slug = $this->translatepress_url_converter->get_url_slug( $feed_language ); if ( $slug ) { $slug = '/' . $slug; }else{ $slug = ''; } return $slug; } /** * Check if the table exists. * * @param string $table_name The table name. * * @return bool */ private function table_exists( $table_name ) { // phpcs:ignore global $wpdb; return $wpdb->get_var( "SHOW TABLES LIKE '{$table_name}'" ) === $table_name; // phpcs:ignore } private static function get_translatable_strings( $output ) { // Split the input string into an array using new lines and HTML entities as separators $lines = preg_split( '/(<[^>]+>|\\n)/', $output, - 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); // Filter out empty lines and trim each line $result = array_filter( array_map( 'trim', $lines ) ); return $result; } public function add_utm_tracker( $url, $config ) { $utm = $config->campaign_parameters; if ( ! empty( $utm['utm_source'] ) && ! empty( $utm['utm_medium'] ) && ! empty( $utm['utm_campaign'] ) ) { $utm = [ 'utm_source' => str_replace( ' ', '+', $utm['utm_source'] ), 'utm_medium' => str_replace( ' ', '+', $utm['utm_medium'] ), 'utm_campaign' => str_replace( ' ', '+', $utm['utm_campaign'] ), 'utm_term' => str_replace( ' ', '+', $utm['utm_term'] ), 'utm_content' => str_replace( ' ', '+', $utm['utm_content'] ), ]; $url = add_query_arg( array_filter( $utm ), $url ); } return $url; } }