WPML
do_action( 'wpml_switch_language', string|null $language_code )
タイプ
action
WPMLバージョン
3.2.2

説明

このアクションフックは、WPMLがデータベースクエリをフィルターするために使用する言語を設定します。これはスコープとして機能します。言語コードでスコープを開き、nullで閉じます。

スイッチはネストします。 WPML 5.0以降、WPMLは開いているスイッチをスタックに保持します。言語コードを伴う呼び出しごとに、新しいスコープが開かれます。nullを伴う呼び出しは、まだ開いている最後のスコープを閉じ、周囲のコードに言語を戻します。したがって、nullはリクエストが開始された時点の言語ではなく、自身のスイッチの言語を復元します。この2つが同じになるのは、自身のスイッチのみが開いている場合だけです。開いているスコープがない場合、WPMLは最初のスイッチが行われる前のリクエストの言語にフォールバックします。

各スイッチには独自の復元が必要です。 スコープを開く各呼び出しと、nullを渡す1つの呼び出しをペアにしてください。コードが例外をスローした場合でも実行されるように、復元処理はfinallyブロック内に配置します。スコープを開いたままにすると、リクエストの残りの部分は指定した言語で実行され、WPMLは言語が切り替えられたと報告し続けます。

元の言語を指定して復元しないでください。 言語コードは常にスコープを開きます。WPMLがそれを復元として読み取ることはありません。do_action( 'wpml_switch_language', $previous_language )のような呼び出しは、最初のスコープを閉じるのではなく、2つ目のスコープを開きます。ペアの直後は現在の言語が正しいため、これに気づくのは困難です。問題はリクエストの後半で発生します。開いたままにしたスコープが周囲の次の復元によって閉じられ、そのコードが間違った言語で実行されるためです。これは通常、メール、RESTレスポンス、および管理画面で現れます。このパターンは、スタックの代わりに1つの共有スロットを使用していたWPML 4.xでは正しいものでした。お使いのプラグインでまだこれを使用している場合は、名前で言語を復元するとWPMLが切り替わったままになるを参照してください。

一度に1つのクエリを変更してください。 スイッチと復元の間でクエリを実行します。pre_get_postsで言語を切り替えないでください。このコールバックはクエリが実行される前に終了するため、スコープを閉じる場所がありません。

引数

$language_code
(string|null) (省略可能) 切り替え先の言語。有効な言語の2文字(またはそれ以上)のコードを使用するか、すべての有効な言語からコンテンツをクエリするには「all」を使用します。各言語コードは新しい言語スコープを開きます。自身の切り替えによって開かれたスコープを閉じるには、nullを渡します。デフォルトはnullです。

スコープを閉じるのはnullのみです。空の文字列、false、および0は、他の値と同様にスコープを開きます。これらは言語を変更しないため、その時点では問題ないように見えますが、スコープは開いたままになります。渡す前に、言語コードが空でないことを確認してください。

使用例


言語スコープを開き、その中で処理を実行して、finallyブロックでスコープを閉じます。finallyブロックは、コードが例外をスローした場合にも実行されます。
// 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 );
}

言語名を指定した復元の禁止


このパターンはWPML 4.xでは正しいものでした。WPML 5.0以降では不具合となります。2回目の呼び出しは、最初のスコープを閉じるのではなく、2つ目のスコープを開きます。
$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

すべてのコンテンツの言語情報の取得フック(6件) →