WPML
Statut
Résolu par l’auteur
Résolu dans
Impreza 8.18.5
Extension/thème associé
Impreza
Étiquettes de sujet
Compatibility

Aperçu de l’anomalie

Avec le thème Impreza, lorsque vous utilisez certains widgets comme Action box, Icon box, Texte, etc., et que vous leur attribuez des URL, ces URL apparaissent encodées dans l’Éditeur de traduction avancé de WPML, ce qui rend leur traduction compliquée.

Vous pouvez également voir une erreur similaire :

htmlspecialchars_decode(): Argument #1 ($string) must be of type string, array given .../wp-content/plugins/sitepress-multilingual-cms/addons/wpml-page-builders/classes/Shared/st/strategy/shortcode/class-wpml-pb-update-shortcodes-in-content.php:203

Solution de contournement

Veuillez vous assurer d’avoir une sauvegarde complète de votre site avant de continuer.


  • Ouvrez le fichier …/wp-content/plugins/us-core/plugins-support/wpml.php.

  • Cherchez la ligne 42.

  • Remplacez le code lié à wpml_pb_shortcode_encode_us_link et wpml_pb_shortcode_decode_us_link par :
    if ( ! function_exists( 'wpml_pb_shortcode_encode_us_link' ) ) {
    	/**
    	 * Add support for "link" control
    	 *
    	 * @param string $string
    	 * @param string $encoding
    	 * @param string $original_string
    	 * @return string
    	 */
    	function wpml_pb_shortcode_encode_us_link( $string, $encoding, $original_string ) {
    		if ( 'us_link' === $encoding ) {
    			$output = array();
    			
    			//In translation we can save the new encoding method only i.e. JSON.
    			foreach ( $string as $combined_key => $value ) {
    				$parts = explode( '_', $combined_key );
    				$i = array_pop( $parts );
    				$key = implode( '_', $parts );
    				$cleaned_keys[ $i ][ $key ] = $value;
    			}
    	 
    			foreach ( $cleaned_keys as $subkey ) {
    				foreach ( $subkey as $key => $value ) {
    					$output[$key] = $value;
    				}   
    			}
    	 
    			$string = urlencode(json_encode($output));
    		}
    		return $string; 
    	}
    	add_filter( 'wpml_pb_shortcode_encode', 'wpml_pb_shortcode_encode_us_link', 10, 3 );
    }
    
    if ( ! function_exists( 'wpml_pb_shortcode_decode_us_link' ) ) {
    	/**
    	 * Add support for "link" control
    	 *
    	 * @param string $string
    	 * @param string $encoding
    	 * @param string $original_string
    	 * @return array
    	 */
    	function wpml_pb_shortcode_decode_us_link( $string, $encoding, $original_string ) {
    		if ( 'us_link' === $encoding ) {
    
    			$original_string = urldecode( $original_string );
    			$is_json = true;
    			$strings = json_decode($original_string);
    			$string = [];
    			
    			// There are two types of encoding, the new method uses JSON and old method uses custom encoding.
    			if ($strings === NULL) {
    				$is_json = false;
    				$strings = explode("|", $original_string);
    			}
    			
    			foreach ( $strings as $i => $value ) {
    				if ($is_json) {
    					$rows[][$i] = $value;
    				} else {
    					$item =  explode(":", $value);
    					$key = $item[0];
    					unset($item[0]);
    		
    					$value = implode(":", $item);
    					$row[$key] = $value;
    					$rows[] = $row;
    		
    					unset($row[$key]);
    				}
    				
    			}
    	 
    			foreach ( $rows as $i => $row ) {
    				foreach ( $row as $key => $value ) {
    					if ( $key == 'url'  ) {
    						$string[ $key . '_' . $i ] = array( 'value' => $value, 'translate' => true );
    					} else {
    						$string[ $key . '_' . $i ] = array( 'value' => $value, 'translate' => false );
    					}
    				}
    			}
    		}
    		return $string; 
    	}
    	add_filter( 'wpml_pb_shortcode_decode', 'wpml_pb_shortcode_decode_us_link', 10, 3 );
    }
  • Ajoutez une petite modification sur la page d’origine, puis traduisez-la

Toutes les anomalies connues →