다국어 사이트에서는 의도적으로 다르게 작동하는 몇 가지 기능이 있습니다. 기본 언어 용어를 키로 사용하는 WordPress 함수, WordPress에서 현지화할 수 없는 날짜 접미사, 고급 번역 에디터가 임의로 생성하지 않는 슬러그 등이 이에 해당합니다. 지원 문의에서는 이를 버그로 제기하지만 버그가 아닙니다. 이 페이지에서는 어떤 일이 발생하고, 그 이유는 무엇이며, 대신 어떻게 해야 하는지 설명합니다.
번역된 글의 has_category() 및 기타 조건부 태그
WordPress 코어의 has_category()은 의도적으로 WPML에서 필터링하지 않습니다. 번역에서 카테고리는 고유한 슬러그를 가진 번역된 용어이므로 프랑스어 글이 프랑스어 "news" 카테고리에 있더라도 프랑스어 글의 has_category('news')는 false입니다. has_term(), in_category() 및 기본 언어 슬러그나 용어 ID를 비교하는 모든 코드에도 동일하게 적용됩니다. 번역된 슬러그로 조건부를 호출하거나 wpml_object_id 필터를 통해 먼저 용어 ID를 확인하세요.
표시되는 내용
기본 WordPress 함수인 has_category는 번역된 글에서 작동하지 않습니다.
이에 대한 예는 다음과 같습니다.
- 영어 슬러그가 “test”이고 프랑스어 번역이 “test-fr”인 카테고리가 있습니다.
- 이 카테고리는 글에 할당됩니다.
- 테마의 single.php 파일 루프 내에서
has_category("test")을 호출하면 기본 언어에 대해서는 true를 반환하지만 번역에 대해서는 false를 반환합니다.
해결 방법
테마의 functions.php 파일에 새 필터를 정의하세요.
function wp_has_category ($category) {
$category = get_term_by('name', $category, 'category');
return has_category($category);
}
add_filter('wp_has_category', 'wp_has_category', 10, 1);has_category 함수를 이 새 필터로 교체하세요.
apply_filters( 'wp_has_category', 'test' )
이 필터는 원본 카테고리의 이름을 기반으로 번역된 카테고리를 가져오고 번역된 카테고리가 글에 할당되었는지 확인합니다.
참조: wpmlcore-3024.
번역할 수 없는 날짜 접미사(1st, 2nd, 3rd)
이것은 WPML이 아닌 WordPress 코어의 제한 사항입니다. 접미사는 PHP의 날짜 형식에서 제공되며 번역 함수를 거치지 않습니다.
표시되는 내용
일부 테마나 플러그인은 wp_date() 또는 date_i18n() WordPress 함수를 사용하여 날짜를 표시합니다. 이러한 날짜는 선택한 파라미터에 따라 1st 또는 26th와 같은 접미사를 사용할 수 있습니다.
현재 WordPress 코어의 오래된 알려진 제한 사항으로 인해 날짜 접미사를 번역할 수 없습니다.
해결 방법
임시 해결 방법으로 wp_date 필터를 사용하여 날짜를 가져온 다음 페이지에 렌더링되기 전에 접미사를 수정할 수 있습니다. 계속하기 전에 사이트를 전체 백업하고 아래 단계를 따르세요.
- 각 접미사를 문자열(
icl_register_string)로 등록하고 영어 접미사 대신 번역(icl_t)을 반환하는 작은wp_date필터를 테마의 functions.php에 추가하세요. - 날짜가 표시되는 페이지를 여세요. 이렇게 하면 추가된 필터가 실행됩니다.
- WPML → 문자열 번역으로 이동하여 날짜를 번역하세요.
- 언어에 따라 달라질 수 있으므로 각 접미사를 개별적으로 번역해야 합니다(예: 1st, 2nd…).
참조: compsupp-5773.
슬러그를 임의로 생성하지 않는 고급 번역 에디터
에디터는 사용자가 슬러그 필드를 채우면 이를 번역하고 비워두면 원본 슬러그를 유지합니다. 번역된 제목에서 슬러그를 자체적으로 파생하지 않습니다.
표시되는 내용
고급 번역 에디터를 사용하여 글을 번역하는 경우 슬러그 필드가 자동으로 채워지지 않습니다. 그런 다음 슬러그 필드를 비워두기로 결정하면 번역된 글에 원본 언어 슬러그가 로드됩니다.
참조: wpmlsupp-8574.
WooCommerce 상품 짧은 설명의 페이지 빌더 숏코드
짧은 설명은 WordPress의 정의에 따라 일반 텍스트 필드인 글 요약이므로 WPML은 콘텐츠에서와 같은 방식으로 페이지 빌더 숏코드를 구문 분석하지 않습니다. WooCommerce가 이를 렌더링하기 때문에 이 불일치가 사용자에게 혼란을 줄 수 있습니다.
표시되는 내용
WooCommerce 상품 짧은 설명은 글 요약 필드를 기반으로 하며, 이는 일반적으로 숏코드를 처리하지 않는 단순한 텍스트 필드입니다. 따라서 글 요약에 페이지 빌더 숏코드를 붙여넣어도 작동할 것으로 예상되지 않으며, 글 요약을 번역할 때 WPML은 이러한 숏코드를 처리하려고 시도하지 않습니다.
그러나 WC는 이러한 “요약”을 약간 다르게 처리하여 숏코드가 작동하지만, WPML은 여전히 숏코드가 작동하지 않는 것처럼 동작합니다. 따라서 숏코드에 번역이 필요한 속성이나 자동으로 처리해야 하는 내부 링크가 포함되어 있는 경우 이를 쉽게 처리할 수 없습니다.
해결 방법
이 기능을 제공하기 위해 플러그인으로 추가할 수 있는 코드를 준비했습니다. 아래 코드를 복사하여 wpmlpb-excerpts.php라는 파일에 붙여넣고 wp-content/plugins/ 디렉토리에 저장한 다음 플러그인을 활성화하세요.
<?php
/**
* Plugin Name: WPML Page Builders - Proces Excerpts
* Description: Parses shortcode strings in exceprts.
* Version: 1.0
*/
namespace WPMLPB686;
( new Excerpts() )->add_hooks();
class Excerpts {
const SEPARATOR_START = '<!--WPML_EXCERPT_START-->';
const SEPARATOR_END = '<!--WPML_EXCERPT_END-->';
public function add_hooks() {
add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 );
add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 );
add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 );
}
public function joinWithContent( $content, $id ) {
$post = get_post( $id );
if ( $post && $post->post_excerpt ) {
$content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END;
}
return $content;
}
public function excludeFromJob( $package, $post ) {
if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) {
$package['contents']['excerpt']['translate'] = 0;
$package['contents']['excerpt']['data'] = '';
}
return $package;
}
public function splitFromContent( $post_id ) {
$post = get_post( $post_id );
if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) {
$start_pos = strpos( $post->post_content, self::SEPARATOR_START );
$end_pos = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );
if ( false !== $end_pos ) {
$content = substr( $post->post_content, 0, $start_pos );
$excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );
if ( $excerpt ) {
wp_update_post(
[
'ID' => $post_id,
'post_content' => $content,
'post_excerpt' => $excerpt,
]
);
}
}
}
}
}
참조: wpmlpb-686.
WordPress.com 호스팅의 언어당 개별 도메인
WordPress.com은 하나의 사이트에 하나의 도메인을 매핑합니다. "언어당 개별 도메인" URL 형식은 모든 언어 도메인이 동일한 WordPress에 도달해야 하지만 해당 호스팅에서는 이를 제공하지 않습니다.
표시되는 내용
WordPress.com의 도메인 매핑 작동 방식에 대한 제한 사항으로 인해 해당 호스팅을 사용할 때 언어당 개별 도메인을 사용하도록 언어 URL 설정을 선택할 수 없습니다.
해결 방법
언어당 개별 도메인 대신 디렉토리별 다른 언어나 파라미터로 추가된 언어 이름과 같은 다른 언어 URL 옵션 중 하나를 사용할 수 있습니다.
언어당 개별 도메인이 꼭 필요한 경우 다른 호스트가 필요합니다.
참조: wpmltriage-2045.
가져온 번역 및 번역 에디터
가져오기는 완료된 번역을 기록하지만 번역 작업을 생성하지 않으며 에디터는 작업을 기반으로 작동합니다. 번역은 프런트엔드에서 완료되며 고급 또는 클래식 번역 에디터에서 편집할 수 없을 뿐입니다.
표시되는 내용
WP All Import 및 WPML All Import 애드온을 사용하여 콘텐츠를 가져올 때마다 프런트엔드에서 가져온 글 번역이 완벽하게 표시됩니다. 그러나 WPML의 번역 에디터를 사용하여 업데이트하려고 하면 문제가 발생합니다.
- 클래식 번역 에디터에는 가져온 번역 대신 기본 언어로 콘텐츠가 표시됩니다.
- 고급 번역 에디터에는 빈 번역이 표시됩니다.
이는 다국어 콘텐츠를 가져올 때 WPML이 문자열 분할에 필요한 번역 작업을 생성하지 않기 때문입니다.
해결 방법
가져온 번역을 편집하거나 업데이트하려면 기본 WordPress 에디터로 전환하여 수동 번역을 사용하세요.
참조: WPMLAI-168.