Использование apply_filters внутри функции add_action без применения изменений фильтра

У меня есть плагин, и я использую add_action для подключения к auth_cookie_valid, чтобы изменить способ обработки файлов cookie входа.

Я хочу создать фильтр внутри ловушки, чтобы пользователи могли немного контролировать логику.

У меня это внутри моего хука auth_cookie_valid, который имеет значение по умолчанию false, затем применяет фильтр:

$allowDuplicateSessions = false;
$allowDuplicateSessions = apply_filters('persistent_login_allow_duplicate_sessions', $allowDuplicateSessions); 

а в functions.php у меня есть вот что:

function handle_persistent_login_allow_duplicate_sessions($allowDuplicateSessions) {
    $allowDuplicateSessions = true;
    return $allowDuplicateSessions;
}
add_filter('persistent_login_allow_duplicate_sessions', 'handle_persistent_login_allow_duplicate_sessions');

Однако $allowDuplicateSessions всегда возвращает false.

Мне интересно, не работает ли фильтр в functions.php слишком поздно для перехвата auth_cookie_valid? Но в документации я ничего не заметил.

Я думаю, это потому, что я переместил свой код apply_filters в ловушку действия wp_footer, и он вернул true. Итак, я начинаю думать, что проблема в auth_cookie_valid?

Функция, как запрошено ниже (я удалил много нерелевантных строк, так как это довольно большая функция:

// update auth cookie with new login time, expiry time & IP address
function persistent_login_update_auth_cookie($cookieElements, $user) {

    if ( $user ) :
        $persistent_login_roles = get_option( 'persistent_login_options_user_access' );

        if ( $persistent_login_roles ) :
            if ( array_intersect($user->roles, $persistent_login_roles) ) : 

                // update the cookie expiration time
                $options = get_option('persistent_login_options_premium');
                if ( $options ) :
                    $expiration = $options['cookieTime'];                           
                else :
                    $expiration = strtotime('1 year', 0); // 1 year default
                endif;

                // update the IP address and login time of the cookie
                $sessionToken = $cookieElements['token'];

                if ( function_exists( 'hash' ) ) :
                    $verifier = hash('sha256', $sessionToken);
                else :
                    $verifier = sha1( $sessionToken);
                endif;                      

                $sessions = get_user_meta($user->ID, 'session_tokens', true);
                $sessions[$verifier]['login'] = time();
                $sessions[$verifier]['expiration'] = time()+$expiration;
                $sessions[$verifier]['ip'] = $_SERVER["REMOTE_ADDR"];

                // update the token with new data
                $wp_session_token = WP_Session_Tokens::get_instance($user->ID);
                $wp_session_token->update( $sessionToken, $sessions[$verifier]);

                // apply filter for allowing duplicate sessions
                $allowDuplicateSessions = false;
                $allowDuplicateSessions = apply_filters('persistent_login_allow_duplicate_sessions', $allowDuplicateSessions); 

                // remove any exact matches to this session
                foreach ($sessions as $key => $session) :
                    if ( $key !== $verifier ) : 

                        if ( is_bool($allowDuplicateSessions) ) :
                            if ( $allowDuplicateSessions === false ) :

                                // if we're on the same user agent and same IP, we're probably on the same device
                                // delete the duplicate session
                                if ( 
                                    ($session['ip'] === $sessions[$verifier]['ip']) &&
                                    ($session['ua'] === $sessions[$verifier]['ua'])
                                ) :
                                    $updateSession = new Persistent_Login_Manage_Sessions($user->ID);
                                    $updateSession->persistent_login_update_session($key);                                               
                                endif;

                            endif;
                        else :
                            return new WP_Error( 'broke', __( "Error, expected boolean value in persistent_login_allow_duplicate_sessions filter." ) );
                        endif; // end boolean check

                    endif; // if key is different to identifier 
                endforeach;

                // set users local cookie again - checks if they should be remembered
                $rememberUserCheck = get_user_meta($user->ID, 'persistent_login_remember_me', true);

                if ( $rememberUserCheck === 'true' ) :

                    // if the user should be remembered, reset the cookie so the cookie time is reset
                    wp_set_auth_cookie($user->ID, true, is_ssl(), $sessionToken);

                else : 

                    // if the users doen't want to be remembered, don't re-set the cookie

                endif; 

            endif; // end if roles match the user roles
        endif; // endif persistent login roles
     endif; // endif user
    }
    add_action('auth_cookie_valid', 'persistent_login_update_auth_cookie', 10, 2);

Можете ли вы добавить к вопросу часть add_action('auth_cookie_valid')? Чтобы убедиться, что add_action выполняется правильно. Или все функции, в которых находится apply_filters('persistent_login_allow_duplicate_sessions', $allowDuplicateSessions);.

Omar Tanti 27.10.2018 12:31

Привет, я добавил всю функцию (хотя это большая цитата!)

lukeseager 10.11.2018 10:29

Просто для проверки: если вы замените apply_filters('persistent_login_allow_duplicate_sessions', $allowDuplicateSessions); на handle_persistent_login_allow_duplicate_sessions($allowDupli‌​cateSessions) внутри persistent_login_update_auth_cookie (), вернет ли он истину или ложь?

Omar Tanti 11.11.2018 12:35

Извините, это заняло так много времени. Интересно ... он возвращает Fatal error: Call to undefined function handle_persistent_login_allow_duplicate_sessions() во время входа в систему, но если я вхожу в систему и загружаю страницу, он возвращает истину.

lukeseager 30.11.2018 21:29

это означает, что когда вы пытаетесь получить доступ к этой функции внутри ловушки auth_cookie_valid, ваша функция еще не зарегистрирована. По этой причине он не выполняется с apply_filter. Вы можете попробовать добавить функциональность внутри auth_cookie_valid. Вы также можете найти последовательность выполнения хуков здесь: rachievee.com/the-wordpress-hooks-firing-sequence

Omar Tanti 02.12.2018 08:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
392
0

Другие вопросы по теме