Как сохранить локализацию пользователя в куках для последующих заходов на сайт?

Есть сайт на 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);
→ Ссылка