问题描述

我在模板中提供 front-end 登录,使用功能 wp_login_form 。它在登录和注销后处理重定向非常整齐!但是如果用户名/密码不匹配或不存在,则用户将被重定向到管理员登录页面,并出现抖动的 js 错误。同样的情况,当我尝试重置密码,它需要我到我的后端页面,我必须输入我的电子邮件重置密码。我想在我的模板上显示这两个活动。有办法我可以做到吗

感谢您提前提供任何帮助。

最佳解决方案

是的,这是可能的。您必须为此创建三个过滤器。

管理员内部的一个类

class WPSE29338_Admin {
    public static function setup() {
        add_filter('login_url', array(__CLASS__, 'modifyLoginURL'), 10, 2);
        add_filter('lostpassword_url', array(__CLASS__, 'modifyLostPasswordURL'), 10, 2);
        add_filter('register', array(__CLASS__, 'modifyRegisterURL'));
    }

    public static function modifyLoginURL($loginUrl, $redirect = '') {
        $loginUrl = site_url('login'); // Link to login URL

        if(!empty($redirect)) {
            $loginUrl = add_query_arg('redirect_to', urlencode($redirect), $loginUrl);
        }

        return $loginUrl;
    }

    public static function modifyLostPasswordURL($lostpwUrl, $redirect = '') {
        $lostpwUrl = wp_login_url() . '#lostpassword'; // Link to lostpassword URL

        if(!empty($redirect)) {
            $lostpwUrl = add_query_arg('redirect_to', urlencode($redirect), $lostpwUrl);
        }

        return $lostpwUrl;
    }

    public static function modifyRegisterURL($registerUrl) {
        if(!is_user_logged_in()) {
            if (get_option('users_can_register')) {
                $registerUrl = '<a href="'%20.%20wp_login_url()%20.%20'#register" class="btn">' . __('Register') . '</a>'; // Link to register URL
            } else {
                $registerUrl = '';
            }
        }

        return $registerUrl;
    }
}

首先,我们需要过滤 wp_login_form()使用的函数 wp_login_url()的输出,形式为 action 属性。

看看方法 modifyLoginUrl()。这里我们将页面 login 的 URL 存储在变量 $loginUrl 中。这个页面必须存在于 WordPress 中,所以先创建它。

接下来,我们需要一个功能 wp_lostpassword_url()wp_register()的过滤器。基本上是一样的站点的 URL 存储在变量 $lostpwUrl$registerUrl 中。

最后但并非最不重要的是,您必须在正确的动作钩上调用该类。对于主题,这应该是 after_setup_theme,对于插件,您可以使用 plugins_loaded

主题/functions.php

add_action('after_setup_theme', 'wpse29338_admin_init');
function wpse29338_admin_init() {
    WPSE29338_Admin::setup();
}

Plugins

add_action('plugins_loaded', 'wpse29338_admin_init');
function wpse29338_admin_init() {
    WPSE29338_Admin::setup();
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。