WPML
do_action( 'wpml_switch_language', string|null $language_code )
Tipo
action
Versione di WPML
3.2.2

Descrizione

Questo action hook imposta la lingua che WPML usa per filtrare le query del database. Funziona come un ambito: un codice lingua apre l’ambito e null lo chiude.

I cambi di lingua si nidificano. A partire da WPML 5.0, WPML mantiene i cambi aperti in uno stack. Ogni chiamata con un codice lingua apre un nuovo ambito. Una chiamata con null chiude l’ultimo ambito ancora aperto e restituisce la lingua al codice circostante. Quindi null ripristina la lingua del tuo cambio, non la lingua con cui è iniziata la richiesta. Le due coincidono solo quando il tuo cambio è l’unico aperto. Quando non c’è nessun ambito aperto, WPML torna alla lingua che la richiesta aveva prima del suo primo cambio.

Ogni cambio ha bisogno del proprio ripristino. Associa ogni chiamata che apre un ambito a una chiamata che passa null. Inserisci il ripristino in un blocco finally, in modo che venga eseguito anche quando il tuo codice genera un’eccezione. Se lasci un ambito aperto, il resto della richiesta viene eseguito nella tua lingua e WPML continua a segnalare che la lingua è cambiata.

Non ripristinare indicando la lingua di provenienza. Un codice lingua apre sempre un ambito. WPML non lo legge mai come un ripristino. Una chiamata come do_action( 'wpml_switch_language', $previous_language ) apre un secondo ambito invece di chiudere il primo. Questo è difficile da notare, perché la lingua corrente è corretta subito dopo la coppia. Il problema si presenta più tardi nella richiesta: l’ambito che hai lasciato aperto viene chiuso dal successivo ripristino circostante, e quel codice viene quindi eseguito nella lingua sbagliata. Di solito si manifesta nelle e-mail, nelle risposte REST e nelle schermate dell’area di amministrazione. Questo schema era corretto in WPML 4.x, che usava uno slot condiviso invece di uno stack. Se il tuo plugin lo usa ancora, vedi Ripristinare la lingua per nome lascia WPML cambiato.

Cambia una query alla volta. Esegui la tua query tra il cambio e il ripristino. Non cambiare la lingua in pre_get_posts: quel callback termina prima dell’esecuzione della query, quindi non hai un posto dove chiudere l’ambito.

Argomenti

$language_code
(string|null) (Opzionale) La lingua a cui passare. Usa il codice a 2 lettere (o più lungo) di una lingua attiva, oppure “all” per eseguire query sui contenuti di tutte le lingue attive. Ogni codice di lingua apre un nuovo ambito linguistico. Passa null per chiudere l’ambito aperto dal tuo cambio. Il valore predefinito è null

Solo null chiude un ambito. Una stringa vuota, false e 0 ne aprono uno, come qualsiasi altro valore. Non cambiano la lingua, quindi nulla sembra sbagliato in quel momento, ma l’ambito rimane aperto. Verifica che il tuo codice di lingua non sia vuoto prima di passarlo.

Esempio di utilizzo

Esempio
Apri un ambito linguistico, esegui il tuo lavoro al suo interno e chiudi l’ambito in un blocco finally. Il blocco finally viene eseguito anche quando il tuo codice genera un’eccezione.
// 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 );
}

Non ripristinare nominando la lingua


Questo pattern era corretto in WPML 4.x. A partire da WPML 5.0 è un difetto: la seconda chiamata apre un secondo ambito invece di chiudere il primo.
$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

Tutti i 6 hook della categoria Recupero delle informazioni sulla lingua per i contenuti →