do_action( 'wpml_switch_language', string|null $language_code )
- Type
- action
- Version de WPML
- 3.2.2
Description
Ce hook d’action définit la langue que WPML utilise pour filtrer les requêtes de base de données. Il fonctionne comme une portée : un code de langue ouvre la portée, et null la ferme.
Les changements s’imbriquent. Depuis WPML 5.0, WPML conserve les changements ouverts dans une pile. Chaque appel avec un code de langue ouvre une nouvelle portée. Un appel avec null ferme la dernière portée encore ouverte et restitue la langue au code englobant. Ainsi, null restaure la langue de votre propre changement, et non la langue dans laquelle la requête a commencé. Les deux sont identiques uniquement lorsque votre changement est le seul à être ouvert. Lorsqu’aucune portée n’est ouverte, WPML revient à la langue que la requête avait avant son premier changement.
Chaque changement nécessite sa propre restauration. Associez chaque appel qui ouvre une portée à un appel qui transmet null. Placez la restauration dans un bloc finally, afin qu’elle s’exécute également lorsque votre code lève une exception. Si vous laissez une portée ouverte, le reste de la requête s’exécute dans votre langue, et WPML continue de signaler que la langue est modifiée.
Ne restaurez pas en nommant la langue d’origine. Un code de langue ouvre toujours une portée. WPML ne le lit jamais comme une restauration. Un appel comme do_action( 'wpml_switch_language', $previous_language ) ouvre une deuxième portée au lieu de fermer la première. Cela est difficile à voir, car la langue actuelle est correcte juste après la paire. Le problème apparaît plus tard dans la requête : la portée que vous avez laissée ouverte est fermée par la prochaine restauration du code englobant, et ce code s’exécute alors dans la mauvaise langue. C’est généralement dans les e-mails, les réponses REST et les écrans de l’interface d’administration que cela se manifeste. Ce modèle était correct dans WPML 4.x, qui utilisait un emplacement partagé au lieu d’une pile. Si votre extension l’utilise toujours, consultez Restaurer la langue par son nom laisse WPML modifié.
Modifiez une requête à la fois. Exécutez votre requête entre le changement et la restauration. Ne changez pas la langue dans pre_get_posts : cette fonction de rappel se termine avant l’exécution de la requête, vous n’avez donc aucun endroit pour fermer la portée.
Arguments
- $language_code
- (string|null) (Facultatif) La langue vers laquelle basculer. Utilisez le code à 2 lettres (ou plus) d’une langue active, ou « all » pour interroger le contenu de toutes les langues actives. Chaque code de langue ouvre une nouvelle portée de langue. Passez
nullpour fermer la portée ouverte par votre propre changement. Valeur par défaut : null
Seul null ferme une portée. Une chaîne vide, false et 0 en ouvrent une, comme n’importe quelle autre valeur. Ils ne changent pas la langue, donc rien ne semble anormal à ce stade, mais la portée reste ouverte. Vérifiez que votre code de langue n’est pas vide avant de le passer.
Exemple d’utilisation
Exemple
Ouvrez une portée de langue, exécutez votre travail à l’intérieur, et fermez la portée dans un bloc
finally. Le bloc finally s’exécute également lorsque votre code lève une exception.
// 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 );
}
Ne restaurez pas en nommant la langue
Ce modèle était correct dans WPML 4.x. Depuis WPML 5.0, c’est un défaut : le deuxième appel ouvre une deuxième portée au lieu de fermer la première.
$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 associés
wpml_post_language_details, wpml_switch_language_for_email, wpml_restore_language_from_email, wpml_element_language_code, wpml_element_language_details
Les 6 hooks de la catégorie Récupération des informations sur la langue du contenu →