我正在开发一个自定义登录页面插件。我正在尝试找出如何在不创建“headers ready sent”错误的情况下登录用户。
我在打电话wp_signon
用户直接单击“登录”后,但很快发现这种方法会产生“headers ready sent”错误。我已经转而使用挂钩:
private function attemptLogin() {
add_action( \'after_setup_theme\', array( $this->Cms, \'authenticateUser\' ), 10, 2 );
do_action( \'after_setup_theme\', $_POST[\'username\'], $_POST[\'password\'] );
}
但是,正如您可能猜到的,这会产生相同的错误,因为本质上,我仍然在立即执行登录。
如何让钩子按照自己的计划运行以避免错误,同时仍然可以使用用户的凭据?
我已经在谷歌和这个网站上搜索了答案,但都没有找到。我找到的最接近的答案是this, 但我仍然不确定如何在传递用户凭据的同时实现建议。
最合适的回答,由SO网友:Jörn Lund 整理而成
成功登录后wp_signon()
在http响应标头中设置cookie。因此,必须在将任何HTML输出发送到浏览器之前调用它。否则将出现“headers ready sent”(标头已发送)错误。
成功登录后,应重定向用户。否则,呈现页面HTML时将不会显示登录信息。
非常粗略但有效的代码:
// process login requests each time wordpress renders a page.
function my_custom_login_process() {
// check if login credentials are present in the current http request
if ( isset( $_POST[\'user_login\'] ) && isset( $_POST[\'user_password\'] ) ) {
// try login
$user = wp_signon( $_POST );
if ( is_wp_error($user) ) // didn\'t work. Tell the user.
exit(\'Nope...\');
else // worked! Get him somewhere.
wp_redirect( get_bloginfo(\'url\') );
}
}
add_action(\'after_setup_theme\',\'my_custom_login_process\');
此外,您应该使用nonce保护登录表单,并向上述函数添加nonce验证。最简单的方法是使用
wp_nonce_field()
在登录表单中。
已解释的Nonces
[编辑]:A
Nonce 是唯一的标记,它与表单一起注册。它主要用于确保在接受任何数据进行进一步处理之前,Web服务器已生成表单。管理区域中的所有表单都使用nonce(或至少应该使用)。
在登录过程中,它将针对暴力攻击提供基本保护。(这意味着用包含任意用户名/密码组合的空白POST请求淹没WordPress。)
(顺便说一句:你似乎对挂钩有点误解。你真的不应该注册(do_action()
) 然后打钩(do_action()
) 具有任意函数参数。其他插件也可能注册了它们的功能。This article 看起来是深入理解的一个很好的起点。)