WordPress从电子邮件链接自动登录

时间:2017-12-13 作者:Patrick S

我正在创建一个会员网站,在那里我试图通过发送到特定用户电子邮件地址的链接登录该用户。

我有一个自定义的帖子,名为“Members”,其中我存储了一个名为“user\\u key”的唯一密钥。经过特定的过程后,电子邮件将通过自动登录链接发送给该用户。

示例链接如下所示

http://example.com/process/?key=DcP2K7cmBUrLVRjizs78RAuuoMGRFc6F6TMDm6E6

Process是处理登录部分的页面。这是该页中使用的代码。

get_header();

$key = $_GET[\'key\'];
$args = array(
    \'post_type\' => \'member\',
    \'meta_value\' => $key
);

$properties = new WP_Query($args);

if($properties->have_posts()) : 
    while($properties->have_posts()) : $properties->the_post();
        $author = $post->post_author;

        $user = get_user_by(\'ID\', $author);
        $user_id = $user->ID;

        echo $user_id;

        wp_set_current_user($user_id, $loginusername);
        wp_set_auth_cookie($user_id);
        do_action(\'wp_login\', $loginusername);

        wp_redirect( home_url() );
    endwhile;
endif;
wp_reset_query();

get_footer();
当我转到该特定链接时,我得到以下错误。

“警告:无法修改标题信息-标题已发送”

据我所知,我认为是“wp\\u set\\u auth\\u cookie”部分在加载头之后完成的,这造成了这个问题。

有人知道怎么解决吗?

2 个回复
SO网友:Drupalizeme

更好的方法是在URL中包含user\\u id(甚至可能不是纯文本$code = get_user_meta( $user_id, \'activation_account_token\', true ); 和从用户处检查令牌是相同的-超出此问题的范围)。

错误的原因是此行echo $user_id;

wp_clear_auth_cookie();
wp_set_current_user ( $user->ID );
wp_set_auth_cookie  ( $user->ID );
wp_redirect( home_url() );

You shouldn\'t output anything before the redirect takes place.

已更新

您可以选择如何处理重定向:

在主题模板内,将重定向代码移到get_header();

作用php/插件

更好的选择是使用wp_loaded 在输出任何HTML之前触发。

add_action (\'wp_loaded\', \'login_redirect\');
    function login_redirect() {
        if ( isset( $_GET[\'key\'] ) ) {
            $user = get_users(array(
                \'meta_key\'     => \'key_or_the_name_you_use\',
                \'meta_value\'     => $_GET[\'key\'] ,
                \'number\' => 1,
            ));
            if(count($user) == 1){
                $user_id =$user[0]->ID;
                wp_clear_auth_cookie();
                wp_set_current_user ( $user_id  );
                wp_set_auth_cookie  ( $user_id );
                wp_redirect( home_url() );
                exit;
            }

        }
    }
这是你实际上可以做的,但我认为你误解了我的答案,因为包括用户id可以提高安全性,而不是降低安全性。

包括user\\u id可以将用户id与令牌绑定,因此有人强制URL使其登录,还必须将随机字符串与用户id帐户匹配(这实际上是行业所做的)-当然还有更多的安全检查。

Javascript

echo "<script>location.href=\'get_home_url()\'</script>";

这可以在wp\\U重定向位置输出,以使浏览器进行重定向。

但由于这是浏览器重定向,用户可能阻止了Javascript或重定向的执行。

SO网友:inarilo

在已经有一些输出后,不能发送头。如果要在重定向失败时添加要显示的内容,请将页眉和页脚放在相关代码块中:

//login code
//if redirect happens, code execution halts, so there is no need for an if else

get_header();
//error message
get_footer();

结束

相关推荐

Wp-login.php重定向导致注销进程无法工作

我想创建自定义登录、注册、密码重置;注销页面。为此,我在函数中添加了以下代码。php文件。function custom_login_page() { $new_login_page_url = home_url(); // new login page global $pagenow; if( $pagenow == \"wp-login.php\" && $_SERVER[\'REQUEST_METHOD\'] == \'GET\' ) {