WPML
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) (Необязательно) Язык, на который нужно переключиться. Используйте двухбуквенный (или более длинный) код активного языка или «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

Все хуки категории «Получение информации о языке контента» (6) →