WPML
状态
已由作者解决
解决于
Impreza 8.18.5
相关插件/主题
Impreza
主题标签
Compatibility

问题概述

使用 Impreza 主题时,当使用某些小工具(如 Action box、Icon box、文本等)并为其分配 URL 时,这些 URL 在 WPML 的高级翻译编辑器中会显示为已编码,从而使翻译变得复杂。

您可能还会看到类似的错误:

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

临时解决方法

继续操作前,请确保对您的网站进行完整备份


  • 打开 …/wp-content/plugins/us-core/plugins-support/wpml.php 文件。

  • 找到第 42 行。

  • 将与 wpml_pb_shortcode_encode_us_linkwpml_pb_shortcode_decode_us_link 相关的代码替换为:
    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 );
    }
  • 对原始页面进行少量修改,然后进行翻译

所有已知问题 →