Есть ли у кого-нибудь опыт написания пользовательской страницы входа в 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
Объект, а не идентификатор пользователя.
wp_signon
возвращает WP_Error
при сбое или WP_User
при успешном завершении.
У меня была настоящая проблема... наконец-то ее работала!! (после нескольких дней экспериментов и ударов головой об этом)
Одна вещь, чтобы убедиться, что вы еще не отправили какой-либо вывод или файл cookie сеанса не будет записываться, поскольку он должен находиться в заголовке. Также, если вы вызываете wp_signon до начала сеанса, там сеанс информация также теряется... sheesh... странно, но у меня обоих было мне. Anyhoo no more ado...
//Создайте нового пользователя (например)
$userdata = array('user_login'->$username,'user_pass'->$password);
$user_id = wp_insert_user($userdata);
//Удостоверьтесь, что имя пользователя обновлено... Мне это нужно, поскольку крючок для user_register вызывается в wp_insert_user, но это hook вызывается после создания пользователя, поэтому ему нужна БД кеш ясно работает, иначе было установлено неправильное имя пользователя... Таким образом, пользователь был автоматически зарегистрирован только для одной страницы - смешно. (Это был регистр 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 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, но это могло измениться.
Появляется ли сообщение об ошибке или что вы видите при запуске своего кода?