WPML
do_action( 'wpml_switch_language', string|null $language_code )
Tipo
action
Versão do WPML
3.2.2

Descrição

Este hook de ação define o idioma que o WPML usa para filtrar as consultas ao banco de dados. Ele funciona como um escopo: um código de idioma abre o escopo, e null o fecha.

As trocas se aninham. Desde o WPML 5.0, o WPML mantém as trocas abertas em uma pilha. Cada chamada com um código de idioma abre um novo escopo. Uma chamada com null fecha o último escopo que ainda está aberto, e devolve o idioma para o código ao seu redor. Portanto, null restaura o idioma da sua própria troca, não o idioma com o qual a requisição começou. Os dois são iguais apenas quando a sua troca é a única aberta. Quando nenhum escopo está aberto, o WPML reverte para o idioma que a requisição tinha antes da sua primeira troca.

Cada troca precisa da sua própria restauração. Combine cada chamada que abre um escopo com uma chamada que passa null. Coloque a restauração em um bloco finally, para que ela também seja executada quando o seu código lançar uma exceção. Se você deixar um escopo aberto, o resto da requisição é executado no seu idioma, e o WPML continua relatando que o idioma está trocado.

Não restaure nomeando o idioma de origem. Um código de idioma sempre abre um escopo. O WPML nunca o interpreta como uma restauração. Uma chamada como do_action( 'wpml_switch_language', $previous_language ) abre um segundo escopo em vez de fechar o primeiro. Isso é difícil de notar, porque o idioma atual está correto logo após o par. O problema aparece mais tarde na requisição: o escopo que você deixou aberto é fechado pela próxima restauração ao seu redor, e esse código então é executado no idioma errado. E-mails, respostas REST e telas do painel de administração são onde isso geralmente aparece. Esse padrão estava correto no WPML 4.x, que usava um espaço compartilhado em vez de uma pilha. Se o seu plugin ainda o usa, consulte Restaurar o idioma pelo nome deixa o WPML trocado.

Altere uma consulta por vez. Execute a sua consulta entre a troca e a restauração. Não troque o idioma em pre_get_posts: esse callback termina antes de a consulta ser executada, então você não tem onde fechar o escopo.

Argumentos

$language_code
(string|null) (Opcional) O idioma para o qual alternar. Use o código de 2 letras (ou mais longo) de um idioma ativo, ou “all” para consultar o conteúdo de todos os idiomas ativos. Cada código de idioma abre um novo escopo de idioma. Passe null para fechar o escopo que a sua própria alternância abriu. O padrão é null

Apenas null fecha um escopo. Uma string vazia, false e 0 abrem um, como qualquer outro valor. Eles não alteram o idioma, então nada parece errado nesse momento, mas o escopo permanece aberto. Verifique se o seu código de idioma não está vazio antes de passá-lo.

Exemplo de uso

Exemplo
Abra um escopo de idioma, execute o seu trabalho dentro dele e feche o escopo em um bloco finally. O bloco finally também é executado quando o seu código lança uma exceção.
// 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 );
}

Não restaure nomeando o idioma


Esse padrão estava correto no WPML 4.x. Desde o WPML 5.0, ele é um defeito: a segunda chamada abre um segundo escopo em vez de fechar o primeiro.
$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

Todos os 6 hooks de Recuperar informações de idioma para conteúdo →