是否在呈现快捷代码之前处理登录/注册表单?

时间:2014-02-03 作者:jmoody1988

我正在客户网站的主题中构建一个自定义登录和注册表单,我需要将任何错误消息处理为一个变量,该变量可以显示在表单内的页面上。我正在为表单本身使用短代码,因此在呈现短代码后会执行“after\\u setup\\u theme”操作,这意味着我设置的任何变量都不能用于短代码本身。这也意味着在成功登录时,is_user_logged_in()已事先检查,因此它仍然认为该用户没有实际登录。

在“after\\u setup\\u theme”之前是否还有其他操作可用于处理登录并存储任何错误变量?

编辑:这里是处理登录和操作挂钩的自定义函数。目前,我在页面上打印并使用jQuery将其移动到表单中时出错,但我宁愿找到一个解决方案,允许我将其打印到它所属的位置,这样我就不必在加载时操纵DOM元素。

    function custom_login() {
        if(!is_admin() && !preg_match(\'*wp-login.php*\', $_SERVER[\'REQUEST_URI\'])) {
            $username = isset($_POST[\'log\']) && strlen($_POST[\'log\']) ? $_POST[\'log\'] : \'\';
            $password = isset($_POST[\'pwd\']) && strlen($_POST[\'pwd\']) ? $_POST[\'pwd\'] : \'\';
            if(strlen($username)) {
                $creds = array();
                $creds[\'user_login\'] = $username;
                $creds[\'user_password\'] = $password;
                $creds[\'remember\'] = true;
                $user = wp_signon($creds, false);
                if (is_wp_error($user)) {
                    $login_error = \'<div style="display: none;" id="login-error">\'.$user->get_error_message().\'</div>\';
                    echo $login_error;
                } else {
                    if(isset($_POST[\'redirect_to\']) && strlen($_POST[\'redirect_to\']) > 3) {
                        wp_redirect($_POST[\'redirect_to\']);
                    } else {
                        wp_redirect(home_url().\'/login/\');
                    }
                }
            }
        }
    }
    // run it before the headers and cookies are sent
    if(isset($_POST[\'frontend_login\'])) {
        add_action(\'after_setup_theme\', \'custom_login\');
    } 

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

after_setup_theme 应该not 在短代码处理之后执行。短代码在帖子主体渲染时处理。after_setup_theme 在此之前运行良好。你对问题的分析不正确。

这看起来像variable scope 我有问题。您的custom_login 函数将在该函数外部可访问。它们的“范围”在函数内部。

要解决这个问题,需要声明变量global 或者将整个内容包装在一个类中,以便可以使用类语法访问变量。概念验证:

class test_class {
  static $test = \'hi\';

  public function change_var() {
    static::$test = \'hello\';
  }

}
add_action(\'after_setup_theme\',\'test_class::change_var\');
还有其他方法可以做到这一点。

结束

相关推荐

SSL设置:WP-LOGIN CSS不通过HTTPS加载

我有一个使用SSL的多站点设置。一切正常。访问者通过https获取所有内容。我的页面源中没有一个没有httpS的url。(包括指向css、js文件的URL)但是,一旦进入登录页面,我的所有css文件都有一个带有http的URL,而不是https。所以大多数浏览器都会屏蔽这些不安全的源代码,从而破坏了管理界面。页面本身通过https加载,所有重定向也通过https提供。我的网站url设置为https://...I\'v搜索了我的数据库和项目文件,没有对http://...什么会导致此问题?