- 상태
- 개발자가 해결함
- 해결된 버전
- 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_link 및 wpml_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 ); } - 원본 페이지를 약간 수정한 다음 번역하세요.