我在插件内部和短代码函数中使用wp_signon
来登录用户。为了澄清,从页面内容调用短代码。 wp_signon
函数成功返回用户信息。但is_user_logged_in()
正在返回 false 。为什么会发生这种情况或如何设置is_user_logged_in()
true 以便用户保持登录状态?
ob_start();
$user_data = array();
$user_data['user_login'] = $username;
$user_data['user_password'] = $password;
$user_data['remember'] = $remember;
$user = wp_signon( $user_data, false );
ob_get_clean();
if ( is_wp_error($user) ) {
$err = $user->get_error_message();
} else {
$_SESSION['fc_user']=$user->ID;
var_dump($user); // gives the user info
var_dump(is_user_logged_in()); // gives false
}
答案 0 :(得分:1)
将标题发送到页面。必须在返回任何内容之前运行它。
因此在短代码中运行它(就像您在评论中指定的那样)为时已晚:标题已经发送。
为了实现你想要的,你应该将代码分成两部分,在不同的时间运行,如下所示:
add_action( 'after_setup_theme', function() {
// run this only on the page you want
if( !is_page('the_page_you_want') )
return;
$user_data = array();
$user_data['user_login'] = $username;
$user_data['user_password'] = $password;
$user_data['remember'] = $remember;
$user = wp_signon( $user_data, false );
if ( is_wp_error($user) ) {
$GLOBALS['user_error_message'] = $user->get_error_message();
} else {
$_SESSION['fc_user'] = $user->ID;
}
} );
add_shortcode( 'your_shortcode', function( $atts ) {
if( is_user_logged_in() ) {
// get user info
return print_r( get_userdata(get_current_user_id()), 1 );
} elseif( isset($GLOBALS['user_error_message']) ) {
// show error
return print_r( $GLOBALS['user_error_message'], 1 );
}
} );
答案 1 :(得分:0)
我刚刚遇到类似的MVC Wordpress插件问题。 对我来说,解决方案是包括
require_once($_SERVER['DOCUMENT_ROOT'].'/wp-includes/pluggable.php');
通过插件访问核心功能。