Кто-нибудь имеет опыт написания пользовательской страницы входа в WordPress с помощью следующих функций:
wp_signon() and wp_set_auth_cookie()
найдено на http://codex.wordpress.org/Function_Reference/
Кажется, я не могу заставить их работать.
Код выглядит примерно так:
function login_wordpress($username, $password) { $creds = array(); $creds['user_login'] = $username; $creds['user_password'] = $password; $creds['remember'] = true; $user = wp_signon( $creds, false ); if ( is_wp_error($user) ) { echo $user->get_error_message(); die(); } else { wp_set_auth_cookie( $user, 0, 0); } }
Я что-то пропустил?
Вам нужно изменить эту строку:
wp_set_auth_cookie( $user, 0, 0);
К этому:
wp_set_auth_cookie( $user->ID, 0, 0);
$user
– это WP_User
объекта, не являющийся $user
WP_User
.
wp_signon
возвращает WP_Error
при сбое, или WP_User
на успех.
У меня была настоящая проблема … наконец-то ее работала !! (после нескольких дней экспериментов и ударов головой об этом)
Одна вещь, чтобы убедиться, что вы еще не отправили какой-либо результат, или файл cookie сеанса не будет записываться, поскольку он должен находиться в заголовке. Также, если вы вызываете wp_signon до начала сеанса, информация о сеансе также теряется … sheesh … странно, но у меня обоих со мной произошло. Anyhoo больше не шутит …
// Создаем нового пользователя (например)
$userdata = array('user_login'->$username,'user_pass'->$password); $user_id = wp_insert_user($userdata);
// Удостоверьтесь, что имя пользователя обновлено … Мне это нужно, поскольку в wp_insert_user был вызван hook_ user_register, но этот hook вызывается после создания пользователя, поэтому ему нужно было очистить кеш БД, иначе неверное имя пользователя был установлен … Таким образом, пользователь был автоматически зарегистрирован только для одной страницы – смешно. (Это был Register Plus Redux, выполняющий привязку кстати.)
wp_cache_delete($user_id, 'users'); wp_cache_delete($username, 'userlogins'); $userdata = get_userdata($user_id); $username = $userdata->user_login;
// Убедитесь, что сеанс пользователя запущен
$vsessionid = session_id(); if (empty($vsessionid)) {session_name('PHPSESSID'); session_start();}
// Вход пользователя
wp_clear_auth_cookie(); $creds = array(); $creds['user_login'] = $username; $creds['user_password'] = $password; $creds['remember'] = true; $user = wp_signon($creds, false);
// Проверяем работу
if (is_wp_error($user)) {$error = $user->get_error_message();} else { wp_set_current_user($user_id); // The next line *really* seemed to help! do_action('set_current_user'); $current_user = wp_get_current_user(); if (is_wp_error($current_user)) {$error = $user->get_error_message();} } if ($error) {echo $error; print_r($userdata); print_r($current_user);}
current_user(); function current_user() { global $current_user,$user_ID; if(is_user_logged_in()) { echo 'User Logged in '.$user_ID; } else { echo 'No user is logged in< br/>'; custom_login(); } } function custom_login() { $creds = array('user_login' => '<USERNAME>', 'user_password' => '<USERPASSWORD>', 'remember' => true ); $user = wp_signon( $creds, false ); wp_set_current_user($user->ID); wp_set_auth_cookie($user->ID, true, false ); do_action( 'wp_login', '<USERNAME>' ); if ( is_wp_error($user) ) echo $user->get_error_message(); } }
Я сделал это в проекте несколько лет назад, поэтому WordPress-код был немного другим. Но этот код работал для меня:
// include the wordpress files necessary to run its functions include('../classpages/wp-config.php'); // this includes wp-settings.php, which includes wp-db.php, which makes the database connection include(ABSPATH . WPINC . '/pluggable-functions.php'); // use wordpress's function to create the login cookies // this creates a cookie for the username and another for the hashed password, which wordpress reauthenticates each time we call its wp_get_current_user() function wp_setcookie($user_login, $user_pass, false, '', '', $cookieuser);
Мне вообще не пришлось использовать wp_signon, но это могло измениться.
Вы получаете сообщение об ошибке или что вы видите при запуске кода?