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
nullpara 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.
Hooks relacionados
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 →