web-dev-qa-db-ja.com

テンプレートページに「ログインエラー」と「パスワードを忘れました」を表示する方法

私は関数wp_login_formを使って、テンプレートでフロントエンドログインを提供しています。ログインとログアウト後のリダイレクトをかなりきれいに処理します。しかし、ユーザー名/パスワードが一致しない、または存在しない場合は、ユーザーは管理者ログインページにリダイレクトされ、不安定なjsエラーが発生します。パスワードを再設定しようとしたときも同様です。パスワードを再設定するには自分の電子メールアドレスを入力する必要があるバックエンドページに移動します。私は自分のテンプレートにこれら両方のアクティビティを表示したいです。私はこれを行うことができる方法はありますか?

事前に助けてくれてありがとう。

10

はい、可能です。これには3つのフィルタを作成する必要があります。

クラス内の管理者用のもの

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="' . wp_login_url() . '#register" class="btn">' . __('Register') . '</a>'; // Link to register URL
            } else {
                $registerUrl = '';
            }
        }

        return $registerUrl;
    }
}

最初に、フォームaction属性でwp_login_url()によって使用される関数wp_login_form()の出力をフィルタリングする必要があります。

メソッド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();
}

プラグイン

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