wp_signon возвращает пользователя, но пользователь не авторизован
Я использую wp_signon()
и она возвращает пользователя, а не ошибку. Однако когда я выполняю is_user_logged_in()
, функция возвращает false.
Буду очень признателен за помощь :)

Функция get_currentuserinfo()
не сработала у меня. Я написал об этой проблеме и её решении в своём блоге:
http://blog.rhysgoodwin.com/programming/wordpress-wp_signon-current_user-is-not-populated/
С уважением, Риз

Это действительно помогло. На случай, если блог пропадёт, он сказал использовать wp_set_current_user()
после wp_signon()
.

Можно ли имитировать вход пользователя через форму авторизации? Я хочу, чтобы пользователь оставался в системе, как при обычном входе.

У меня была такая же проблема. Вот полностью рабочий фрагмент кода, который решает эту проблему:
if( isset($_POST['log']) && isset($_POST['pwd']) ):
$creds = array( 'user_login' => $_POST['log'], 'user_password' => $_POST['pwd'], 'remember' => $_POST['rememberme'] );
$user = wp_signon( $creds, false );
if ( is_wp_error($user) ): echo $user->get_error_message(); endif;
wp_set_current_user($user->ID);
return $user;
endif;
Также у wp_logout()
есть аналогичная проблема. Вот как заставить его работать:
wp_logout();
wp_set_current_user(0);

//функция wp_signon находится в разработке, если вы откроете файлы ядра WordPress
//вы найдете этот комментарий
// TODO стоит ли объявить устаревшим действие wp_authentication?
//я нашел решение
function login_after_register($userlogin,$userpass){
$credentials = array( 'user_login' => $userlogin, 'user_password' => $userpass, 'remember' => true );
$secure_cookie = is_ssl();
$secure_cookie = apply_filters('secure_signon_cookie', $secure_cookie, $credentials);
add_filter('authenticate', 'wp_authenticate_cookie', 30, 3);
$user = wp_authenticate($credentials['user_login'], $credentials['user_password']);
wp_set_auth_cookie($user->ID, $credentials["remember"], $secure_cookie);
do_action('wp_login', $user->user_login, $user);
}
//затем вы должны вызвать ее таким образом
//перед get_header() или любым HTML
login_after_register($_POST['r_user_name'],$_POST['r_password']);
