У меня есть плагин, и я использую 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);
Привет, я добавил всю функцию (хотя это большая цитата!)
Просто для проверки: если вы замените apply_filters('persistent_login_allow_duplicate_sessions', $allowDuplicateSessions); на handle_persistent_login_allow_duplicate_sessions($allowDuplicateSessions) внутри persistent_login_update_auth_cookie (), вернет ли он истину или ложь?
Извините, это заняло так много времени. Интересно ... он возвращает Fatal error: Call to undefined function handle_persistent_login_allow_duplicate_sessions() во время входа в систему, но если я вхожу в систему и загружаю страницу, он возвращает истину.
это означает, что когда вы пытаетесь получить доступ к этой функции внутри ловушки auth_cookie_valid, ваша функция еще не зарегистрирована. По этой причине он не выполняется с apply_filter. Вы можете попробовать добавить функциональность внутри auth_cookie_valid. Вы также можете найти последовательность выполнения хуков здесь: rachievee.com/the-wordpress-hooks-firing-sequence






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