Как сохранить локализацию пользователя в куках для последующих заходов на сайт?
Есть сайт на wordpress с установленным плагином wpml для 2ух языковых локализаций (потенциально может быть больше).
Хочу сделать так, чтобы в куках запоминало пользовательский язык на 30 дней (он его сам выбирает через переключалку wpml) и если пользователь заново заходит с любой страницы с новой ссылкой, то, чтобы его всегда перекидывало на ту локализацию, которая у него установлена в куках.
Русский стоит по умолчанию (ru).
Прописываю в самом верху до тега <!DOCTYPE html> вот такую инструкцию ($_SERVER['HTTP_REFERER'] использую, чтобы определить пользователь воспользовался переключалкой или заново открыл страницу):
<?php
$default_lang = apply_filters( 'wpml_default_language', null );
if($default_lang!= ICL_LANGUAGE_CODE) {
setcookie('language', ICL_LANGUAGE_CODE, time() + 30 * DAY_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
}
if (isset($_COOKIE['language']) && $_COOKIE['language']!= ICL_LANGUAGE_CODE) {
if($_SERVER['HTTP_REFERER']) {
setcookie('language', ICL_LANGUAGE_CODE, time() + 30 * DAY_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
}
else {
$wpml_permalink = apply_filters( 'wpml_permalink', get_the_permalink() , $_COOKIE['language'] );
if(isset($wpml_permalink)) {
wp_redirect( $wpml_permalink );
exit;
}
}
} ?>
Работает хорошо при первом заходе (ru) и переключении на другую локализацию (en), но, если переключателем возвращаюсь на исходную локализацию (ru), то при новом заходе на сайт по старой ссылкой (en) пользователя снова кидает на (en) страницу, хотя он в предыдущем заходе воспользовался переключалкой на (ru). [Надеюсь, доступно описал проблему]
Как можно это исправить?
Ответы (1 шт):
Найдено решение согласно статье которую скинул @Greg
functions.php
/**
* Add ?switch_lang=lang to all url's in the languaqe switcher
*/
add_filter( 'icl_ls_languages', function( $languages ){
global $sitepress;
foreach( $languages as $lang_code => $language ){
$languages[$lang_code]['url'] = add_query_arg( array( 'switch_language' => $lang_code ), $languages[$lang_code]['url'] );
}
return $languages;
} );
/**
* Update language cookie when user switches language
*/
add_action( 'init', function (){
$switch_language = filter_input(INPUT_GET, 'switch_language', FILTER_SANITIZE_STRING);
if( $switch_language ) {
$languages = icl_get_languages();
if( array_key_exists( $switch_language, $languages ) ) {
setcookie('language', $switch_language, time() + 90 * DAY_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
wp_redirect( strtok( $_SERVER['REQUEST_URI'], '?' ) );
exit;
}
}
}, 1);
/**
* Switch language if the user has selected his language before
*/
add_action( 'pre_get_posts', function ( $query ) {
// Disable for admin area & only for main query
if( is_admin() || !$query->is_main_query() ) {
return;
}
// Disable for logged in users
if( is_user_logged_in() ) {
return;
}
$switch_language = filter_input( INPUT_GET, 'switch_language', FILTER_VALIDATE_BOOLEAN );
$user_selected_language = filter_input( INPUT_COOKIE, '_language', FILTER_SANITIZE_STRING );
if ( $user_selected_language && !$switch_language ) {
do_action( 'wpml_switch_language', $user_selected_language );
}
}, 1);