在WordPress插件wp_SignOn中显示错误

时间:2020-08-01 作者:Riskhan

我编写了一个插件来处理登录功能。该插件在内容过滤器中检查登录信息,并仅为登录用户显示。wp\\u signon显示错误/警告

Warning: Cannot modify header information - headers already sent by (output started at W:\\websites\\ku\\wp-includes\\class.wp-styles.php:347) in W:\\websites\\ku\\wp-includes\\pluggable.php on line 943

<?php
/**
 * Plugin Name: test-plugin
 * Description: my test plugin writing experience in WordPress
 * Version: 1.0
 * Author: KK
*/

function my_add_shortcodes() {
    add_shortcode( \'my-login-form\', \'my_login_form_shortcode\' );
}

function my_login_form_shortcode() {
    ob_start();
    require_once(\'forms/login.php\');
    return ob_get_clean();
}

function filter_content( $content ) {
        if ( ! empty( filter_input( INPUT_POST, \'login_submit\' ) ) ) {
            $login_info = array_map( \'sanitize_text_field\', $_POST );
            $email = $login_info[\'email\'];
            $password = $login_info[\'password\'];
            echo \'email \'.$email.\' password \'.$password;
            $user = wp_signon(array(\'user_login\' => $email, \'user_password\' => $password, \'remember\' => $rememberme), is_ssl());
            if( $user instanceof WP_User){
                echo " check_credentials ".$user->display_name;
                wp_set_current_user($user->ID, $user->user_login);
            } else {
                if( is_wp_error($user)){
                    echo $user->get_error_message();
                    $this->$error = "Email or Password error";
                    return $this->$error;
                } 
            }
        } else {
            return "<p>[my-login-form]</p";
        }
        
        return $content;
}
    
add_action( \'init\', \'my_add_shortcodes\' );
add_filter( \'the_content\', \'filter_content\' );

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您想做的事情不能在短代码中完成。

wp_signon 需要为cookie设置一些HTTP头,但为时已晚。

当你的浏览器接收到一个网页时,它会收到一些标题,告诉它正在接收什么,以及它是否成功,它是404,有什么cookie等等。然后它有一个包含网页本身的主体,例如JSON字符串,或一堆HTML。

So once the headers are sent, and the body starts, no more headers can be sent.

这不是WordPress特有的东西,而是一种通用的HTTP/HTML东西。E、 g.如果您运行一个python应用程序,并向浏览器发送一个标题,告诉它HTTP 200,并且主体部分已经开始,那么python应用程序不能在末尾为cookie添加额外的标题。服务器必须响应一个有效的HTTP请求,该请求遵循浏览器要处理的预期格式,然后JS可能会在浏览器端做一些工作并发出额外的请求,这是不允许的。

因此,如果您使用短代码,输出已经开始,您得到了标题、页面标题和正文标记等。这是正文输出,它需要发送标题来完成这一操作,因此第一次任何类型的输出,即使是空白,PHP都会发送HTTP标题,指示HTML正在进行中。

如果你想打电话wp_signon, 这必须发生before 出现任何输出。对于这一点,使用短代码为时已晚。

短代码旨在允许您嵌入需要PHP运行的东西,它们从来没有用于此类功能。当然要嵌入一个登录表单,但处理不能在短代码本身中完成,您需要挂接到早期的钩子中,如init, 查看GET/POST详细信息,查看用户是否提交了表单,然后执行调用所需的所有处理wp_signon 在那一点上。

相关推荐