WPML
do_action( 'wpml_switch_language', string|null $language_code )
Typ
action
WPML-Version
3.2.2

Beschreibung

Dieser Action-Hook legt die Sprache fest, die WPML zum Filtern von Datenbankabfragen verwendet. Er fungiert als Scope: Ein Sprachcode öffnet den Scope, und null schließt ihn.

Umschaltungen lassen sich verschachteln. Seit WPML 5.0 speichert WPML die offenen Umschaltungen auf einem Stack. Jeder Aufruf mit einem Sprachcode öffnet einen neuen Scope. Ein Aufruf mit null schließt den letzten noch offenen Scope und gibt die Sprache an den umgebenden Code zurück. Somit stellt null die Sprache Ihrer eigenen Umschaltung wieder her, nicht die Sprache, in der die Anfrage gestartet wurde. Beide sind nur dann identisch, wenn Ihre Umschaltung die einzige offene ist. Wenn kein Scope offen ist, greift WPML auf die Sprache zurück, die die Anfrage vor ihrer ersten Umschaltung hatte.

Jede Umschaltung benötigt ihre eigene Wiederherstellung. Kombinieren Sie jeden Aufruf, der einen Scope öffnet, mit einem Aufruf, der null übergibt. Setzen Sie die Wiederherstellung in einen finally-Block, damit sie auch ausgeführt wird, wenn Ihr Code eine Exception auslöst. Wenn Sie einen Scope offen lassen, wird der Rest der Anfrage in Ihrer Sprache ausgeführt, und WPML meldet weiterhin, dass die Sprache umgeschaltet ist.

Stellen Sie die Sprache nicht wieder her, indem Sie die Ausgangssprache benennen. Ein Sprachcode öffnet immer einen Scope. WPML interpretiert ihn niemals als Wiederherstellung. Ein Aufruf wie do_action( 'wpml_switch_language', $previous_language ) öffnet einen zweiten Scope, anstatt den ersten zu schließen. Dies ist schwer zu erkennen, da die aktuelle Sprache direkt nach dem Paar korrekt ist. Das Problem tritt später in der Anfrage auf: Der Scope, den Sie offen gelassen haben, wird durch die nächste umgebende Wiederherstellung geschlossen, und dieser Code wird dann in der falschen Sprache ausgeführt. Dies zeigt sich normalerweise bei E-Mails, REST-Antworten und Bildschirmen im Admin-Bereich. Dieses Muster war in WPML 4.x korrekt, das einen einzigen gemeinsamen Slot anstelle eines Stacks verwendete. Wenn Ihr Plugin es immer noch verwendet, lesen Sie Das Wiederherstellen der Sprache über ihren Namen belässt WPML umgeschaltet.

Ändern Sie jeweils nur eine Abfrage. Führen Sie Ihre Abfrage zwischen der Umschaltung und der Wiederherstellung aus. Schalten Sie die Sprache nicht in pre_get_posts um: Dieser Callback endet, bevor die Abfrage ausgeführt wird, sodass Sie keine Möglichkeit haben, den Scope zu schließen.

Argumente

$language_code
(string|null) (Optional) Die Sprache, zu der gewechselt werden soll. Verwenden Sie den zweistelligen (oder längeren) Code einer aktiven Sprache oder ‚all‘, um Inhalte aus allen aktiven Sprachen abzufragen. Jeder Sprachcode öffnet einen neuen Sprachbereich. Übergeben Sie null, um den Bereich zu schließen, den Ihr eigener Wechsel geöffnet hat. Standardmäßig null

Nur null schließt einen Bereich. Ein leerer String, false und 0 öffnen einen, genau wie jeder andere Wert. Sie ändern die Sprache nicht, sodass zu diesem Zeitpunkt nichts falsch aussieht, aber der Bereich bleibt geöffnet. Prüfen Sie, ob Ihr Sprachcode nicht leer ist, bevor Sie ihn übergeben.

Anwendungsbeispiel

Beispiel
Öffnen Sie einen Sprachbereich, führen Sie Ihre Arbeit darin aus und schließen Sie den Bereich in einem finally-Block. Der finally-Block wird auch ausgeführt, wenn Ihr Code eine Ausnahme auswirft.
// 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 );
}

Nicht durch Nennung der Sprache wiederherstellen


Dieses Muster war in WPML 4.x korrekt. Seit WPML 5.0 ist es ein Fehler: Der zweite Aufruf öffnet einen zweiten Bereich, anstatt den ersten zu schließen.
$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

Alle 6 Abrufen von Sprachinformationen für Inhalte-Hooks →