do_action( 'wpml_switch_language', string|null $language_code )
- 유형
- action
- 카테고리
- 콘텐츠의 언어 정보 가져오기
- WPML 버전
- 3.2.2
설명
이 액션 훅은 WPML이 데이터베이스 쿼리를 필터링하는 데 사용하는 언어를 설정합니다. 이 훅은 범위로 작동합니다. 언어 코드가 범위를 열고, null이(가) 이를 닫습니다.
전환은 중첩됩니다. WPML 5.0부터 WPML은 열려 있는 전환을 스택에 유지합니다. 언어 코드를 포함하는 모든 호출은 새 범위를 엽니다. null을(를) 포함하는 호출은 아직 열려 있는 마지막 범위를 닫고, 주변 코드에 언어를 반환합니다. 따라서 null은(는) 요청이 시작될 때의 언어가 아니라 해당 전환의 언어를 복원합니다. 사용자의 전환이 유일하게 열려 있는 전환일 때만 이 두 언어가 동일합니다. 열려 있는 범위가 없으면 WPML은 첫 번째 전환 이전의 요청 언어로 돌아갑니다.
모든 전환에는 자체 복원이 필요합니다. 범위를 여는 각 호출을 null을(를) 전달하는 하나의 호출과 짝지으세요. 코드에서 예외가 발생할 때도 실행되도록 복원 코드를 finally 블록에 넣으세요. 범위를 열어 두면 나머지 요청이 해당 언어로 실행되며, WPML은 언어가 전환되었다고 계속 보고합니다.
이전 언어의 이름을 지정하여 복원하지 마세요. 언어 코드는 항상 범위를 엽니다. WPML은 이를 복원으로 인식하지 않습니다. do_action( 'wpml_switch_language', $previous_language )와(과) 같은 호출은 첫 번째 범위를 닫는 대신 두 번째 범위를 엽니다. 해당 쌍 직후에는 현재 언어가 올바르기 때문에 이 문제를 파악하기 어렵습니다. 문제는 요청의 뒷부분에서 나타납니다. 열어 둔 범위가 주변의 다음 복원에 의해 닫히고, 이후 해당 코드가 잘못된 언어로 실행됩니다. 이 문제는 주로 이메일, REST 응답 및 관리 화면에서 나타납니다. 이 패턴은 스택 대신 하나의 공유 슬롯을 사용했던 WPML 4.x에서는 올바른 방식이었습니다. 플러그인에서 여전히 이 방식을 사용하고 있다면 이름으로 언어를 복원하면 WPML이 전환된 상태로 유지됨을 참조하세요.
한 번에 하나의 쿼리만 변경하세요. 전환과 복원 사이에서 쿼리를 실행하세요. pre_get_posts에서 언어를 전환하지 마세요. 해당 콜백은 쿼리가 실행되기 전에 종료되므로 범위를 닫을 곳이 없습니다.
인수
- $language_code
- (string|null) (선택 사항) 전환할 언어입니다. 활성화된 언어의 2자리(또는 그 이상) 코드를 사용하거나, 모든 활성 언어의 콘텐츠를 쿼리하려면 ‘all’을 사용하세요. 모든 언어 코드는 새로운 언어 스코프를 엽니다. 직접 연 스코프를 닫으려면
null을(를) 전달하세요. 기본값은 null입니다.
null만 스코프를 닫습니다. 빈 문자열, false 및 0는 다른 값과 마찬가지로 스코프를 엽니다. 이러한 값은 언어를 변경하지 않으므로 그 시점에서는 아무런 문제가 없어 보이지만, 스코프는 열린 상태로 유지됩니다. 전달하기 전에 언어 코드가 비어 있지 않은지 확인하세요.
사용 예시
예제
언어 스코프를 열고 그 안에서 작업을 실행한 다음,
finally 블록에서 스코프를 닫으세요. finally 블록은 코드에서 예외가 발생할 때도 실행됩니다.
// Get the 5 latest German posts, then give the language back.
do_action( 'wpml_switch_language', 'de' );
try {
$german_posts = new WP_Query( array(
'post_type' => 'post',
'posts_per_page' => 5,
) );
} finally {
// Closes the scope that the call above opened.
do_action( 'wpml_switch_language', null );
}
언어 이름을 지정하여 복원하지 마세요
이 패턴은 WPML 4.x에서는 올바른 방식이었습니다. WPML 5.0부터는 결함으로 간주됩니다. 두 번째 호출이 첫 번째 스코프를 닫는 대신 두 번째 스코프를 엽니다.
$current = apply_filters( 'wpml_current_language', null ); do_action( 'wpml_switch_language', 'de' ); // ... do_action( 'wpml_switch_language', $current ); // Wrong: this opens a new scope.
관련 훅
wpml_post_language_details, wpml_switch_language_for_email, wpml_restore_language_from_email, wpml_element_language_code, wpml_element_language_details