我正在使用wp_signon()函数登录用户。我这样做是为了
$creds = array();
$creds['user_login'] = $username;
$creds['user_password'] = $password;
$creds['remember'] = true;
$user = wp_signon( $creds, false );
我想在登录后将用户发送到主页。
但我面临以下错误:
警告:无法修改标头信息 - 已在E:\ xampp \ htdocs \ wpmoodle中发送的标头(在E:\ xampp \ htdocs \ wpmoodle \ wp-content \ themes \ twentyten \ header.php:12中开始输出)第690行的\ wp-includes \ pluggable.php。
提前致谢。
答案 0 :(得分:15)
wp_signon()
需要在您将任何实际页面发送到浏览器之前运行。
这是因为wp_signon()
所做的部分工作是设置您的身份验证Cookie。它通过输出“Set-Cookie:...”标题来实现这一点 - 如果你查看pluggable.php
的第690行,你的错误来自哪里,你会看到该行设置了一个cookie。
因此,由于wp_signon()
输出标题,您无法发送任何内容 - 因为标题必须始终在内容之前输出。
但是,错误表明您已经发送了一些输出 - 在header.php
的第12行,可能是标准WordPress主题的第一个HTML。
这基本上表明您需要将wp_signon()
调用移至WordPress处理中较早的某个位置,以便在发送任何页面内容之前输出其标题。
答案 1 :(得分:1)
如果有人需要,这是我的解决方案:
function custom_login() {
if (isset($_POST['submit'])) {
$login_data = array();
$login_data['user_login'] = sanitize_user($_POST['username']);
$login_data['user_password'] = esc_attr($_POST['password']);
$user = wp_signon( $login_data, false );
if ( is_wp_error($user) ) {
echo $user->get_error_message();
} else {
wp_clear_auth_cookie();
do_action('wp_login', $user->ID);
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID, true);
$redirect_to = $_SERVER['REQUEST_URI'];
wp_safe_redirect($redirect_to);
exit;
}
}
}
add_action( 'after_setup_theme', 'custom_login' );