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