wp_signon() не аутентифицирует пользователя, нужна помощь

24 сент. 2013 г., 20:40:45
Просмотры: 25.3K
Голосов: 7

Я использую форму для отправки POST-запроса на страницу и для входа пользователя с помощью wp_signon(), чтобы аутентифицировать пользователя в моей установке WordPress, как описано в документации WP:

$creds = array();
$creds['user_login'] = $_POST["user-login"];
$creds['user_password'] = $_POST["user-password"];
$creds['remember'] = true;

$user = wp_signon( $creds, false );

После этого небольшого фрагмента кода я проверяю, вошел ли пользователь в систему:

if ( is_user_logged_in() ) { echo "SUCCESS"; } else { echo "FAIL!"; }

Но я постоянно получаю FAIL!. Затем, после поисков, я нашел такой трюк:

wp_set_current_user( $user );
if ( is_user_logged_in() ) { echo "SUCCESS"; } else { echo "FAIL!"; }

Я получил SUCCESS в этом случае, но когда я покидаю эту страницу, я снова и снова получаю FAIL.

Может кто-нибудь объяснить мне, как войти в систему с помощью wp_signon() так, чтобы пользователь не выходил из системы после смены страницы, перезагрузки или чего-либо еще.


Я получаю желаемый результат, когда захожу в /wp-admin и вхожу через стандартную форму входа WP. Я могу перемещаться по всем страницам моего сайта WP, оставаясь в системе все время. Но когда я пытаюсь сделать это вне стандартной формы, я получаю FAIL.

Помогите! ПОЖАЛУЙСТА!

11
Комментарии

Есть ли на вашем сайте SSL, то есть ваш URL использует схему http или https??

Anjum Anjum
24 сент. 2013 г. 21:26:34

@Anjum на самом деле я храню его на локальном сервере с MAMP... так что мой ответ Я не знаю ))

LoomyBear LoomyBear
24 сент. 2013 г. 21:44:18

Можешь сказать, как ты обращаешься к странице входа, то есть URL твоей страницы входа, http://localhost/login-page/ или https://localhost/login-page/ ?

Anjum Anjum
24 сент. 2013 г. 21:47:33

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

Anjum Anjum
24 сент. 2013 г. 21:49:18

@Anjum Я использую просто http://localhost:8888/registration/, но если вы намекаете на wp_signon( $user, secure:true/false ), я пробовал оба варианта, и это не сработало. В любом случае, спасибо.

LoomyBear LoomyBear
24 сент. 2013 г. 21:54:14

разместите здесь код вашей страницы регистрации, чтобы я мог решить вашу проблему

Anjum Anjum
24 сент. 2013 г. 22:01:15

@Anjum Вот это на pastebin

LoomyBear LoomyBear
24 сент. 2013 г. 22:17:56

HTML-код формы не найден в вашем коде

Anjum Anjum
24 сент. 2013 г. 22:25:36

@Anjum извините за это... Я обновил pastebin, пожалуйста, проверьте

LoomyBear LoomyBear
24 сент. 2013 г. 22:31:12

у вас нет поля user-login в вашей форме, добавьте текстовое поле с именем user-login и также используйте <?php the_permalink(); ?> в атрибуте action формы вместо <? echo get_permalink( get_page_by_path('registration') ); ?>

Anjum Anjum
24 сент. 2013 г. 22:35:02

@Anjum как вы можете видеть на pastebin $user_login и $user_email это одно и то же $_POST["user_email"], а что касается action формы - это просто постоянная ссылка на ту же страницу, поэтому форма отправляется сама на себя.

LoomyBear LoomyBear
24 сент. 2013 г. 22:38:23
Показать остальные 6 комментариев
Все ответы на вопрос 2
7

Наконец-то это заработало на моей локальной установке WordPress после замены дефисов на подчеркивания в имени атрибута input и использования полных PHP-тегов <?php вместо <?. Финальный код приведен ниже - просто скопируйте и вставьте его в ваш шаблон.

<?php if ( isset($_POST["user_email"]) && isset($_POST["user_password"]) ) {

$user_login     = esc_attr($_POST["user_email"]);
$user_password  = esc_attr($_POST["user_password"]);
$user_email     = esc_attr($_POST["user_email"]);

$user_data = array(
    'user_login'    =>      $user_login,
    'user_pass'     =>      $user_password,
    'user_email'    =>      $user_email,
    'role'          =>      'student'
);

// Вставка нового пользователя в базу данных
//wp_insert_user( $user_data );

$creds = array();
$creds['user_login'] = $user_login;
$creds['user_password'] = $user_password;
$creds['remember'] = true;

$user = wp_signon( $creds, false );

$userID = $user->ID;

wp_set_current_user( $userID, $user_login );
wp_set_auth_cookie( $userID, true, false );
do_action( 'wp_login', $user_login );

}

if ( is_user_logged_in() ) : echo 'УСПЕХ'; ?>
<h1>HTML для авторизованного пользователя</h1>
<?php else : echo 'ОШИБКА!'; ?>
<form id="user-credentials" method="post" action="<?php the_permalink(); ?>">
    <p><input name="user_email" type="text" placeholder="Email" /></p>
    <p><input name="user_password" type="password" placeholder="Пароль" /></p>
    <p><input type="submit" class="button blue size-s" value="Отправить" /></p>
</form>
<?php endif; ?>
24 сент. 2013 г. 22:52:33
Комментарии

Он сохраняет вас в системе при переходе на страницу, отличную от той, где находится форма? Где установлен wp_set_current_user();?

LoomyBear LoomyBear
24 сент. 2013 г. 23:01:13

да, у меня всё работает нормально, проверьте настройки cookies в вашем браузере

Anjum Anjum
24 сент. 2013 г. 23:32:37

Я проверил cookies во всех браузерах. Они везде включены. Когда я использую этот код, пользователь входит в систему только при отправке POST-запроса формы. При перезагрузке страницы без отправки данных никто не авторизован. Я попробовал global $current_user; var_dump($current_user); и получил дамп информации о пользователе только при отправке POST, в противном случае возвращается object(WP_User)#206 (7) { ["data"]=> NULL ["ID"]=> int(0) ...

LoomyBear LoomyBear
24 сент. 2013 г. 23:48:09

также, когда я вхожу через стандартную форму входа WP с тем же пользователем, переменная $current_user выводится корректно в обоих случаях. В чем моя ошибка??!!

LoomyBear LoomyBear
24 сент. 2013 г. 23:49:58

вы вызываете и wp_insert_user(), и wp_signon() при каждом запросе? если да, попробуйте закомментировать wp_insert_user() и затем войти, чтобы увидеть результат.

Anjum Anjum
25 сент. 2013 г. 00:03:36

я загрузил файлы шаблонов на удаленный сервер, и все работает. Извините, что беспокоил вас так долго... это была моя ошибка. Похоже, что wp_signon(); работает как ожидалось

LoomyBear LoomyBear
25 сент. 2013 г. 00:05:31

Думаю, проблема в вашей установке WordPress. Попробуйте переустановить его на локальном сервере.

Anjum Anjum
25 сент. 2013 г. 00:17:29
Показать остальные 2 комментариев
0

Если ваш пароль содержит символы # и/или @, необходимо выполнить urlencode перед отправкой в форме, а затем urldecode перед установкой учетных данных в wp_signon.

URL-кодировка для @ — это %40, для # — %23, а для ! — %21.

Например, если ваш пароль — mY!p@ssWord#, то перед отправкой POST-запроса его следует закодировать в mY%21p%40ssWord%23, а затем раскодировать перед установкой учетных данных для wp_signon.

20 июн. 2019 г. 08:12:47