wordpress wp_signon功能不起作用

时间:2011-03-17 06:55:42

标签: wordpress

我正在使用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。

提前致谢。

2 个答案:

答案 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' );