web-dev-qa-db-ja.com

WP ログインフォームのアクションURLがブラウザで見やすいURLとして表示される(例:パスワードの復元)

WPネイティブログイン/登録/パスワードの復元/ ..機能を使用したいのですが、wp-login.phpの代わりにきれいなURLを表示します

私はコアコードを見てきましたが、ほとんどのログイン関連フォームはハードコーディングされたアクションURLを持っています。たとえば、パスワードの復元フォームには次のアクションURLがあります。

<form name="resetpassform" id="resetpassform" action="<?php echo esc_url( site_url( 'wp-login.php?action=resetpass&key=' . urlencode( $_GET['key'] ) . '&login=' . urlencode( $_GET['login'] ), 'login_post' ) ); ?>" method="post">

だから、私は 'パスワードのリセット'ボタンをクリックすると情報が指定されたアクション、キーとログインのクエリ変数でwp-login.phpファイルに送信されます。

Infoが検証に合格しなかった場合、フォームは再表示され、ブラウザのURLはフォームのアクションで指定されたものになるので、この場合はhttp://example.com/wp-login.php?action=resetpass&key=xyz&login=zyxです。

http://example.com/password-restore?action=resetpass&key=xyz&login=zyxにしたいのですが

これが機能するために、私は以下の解決策を試しました。しかし、私はリダイレクトループに陥ります。

ステップ1.初期復元パスワードのURLはhttp://example.com/wp-login.php?action=rp&key=xyz&login=zyxです。わかりやすくするために、書き換え規則を追加しました。

add_action( 'init', 'pretty_login_urls' );
function pretty_login_urls() {
    add_rewrite_rule( 'password-restore?([^/]+)/?$', "wp-login.php?$1", 'top' );
}

そのため、フォームを復元するための最初のURLは機能しています。

ステップ2しかし、不一致のパスワードを送信すると、フォームが再表示され、URLがhttp://example.com/wp-login.php?action=resetpass&key=xyz&login=zyxになります。その動作が変更されたことに注意してください。

これが私がスタックするところです。そのURLをきれいに表示したいのですが。私はwp-login.phpをきれいなURLにリダイレクトすることを試みて以下の解決策を試みました:

add_action( 'login_init', 'pretty_login_urls_form_action_fix' );
function pretty_login_urls_form_action_fix(){

    $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
    if( in_array( $action, array('rp', 'resetpass') ) ){

        $url = home_url( '/password-restore?action='. $action .'&key=' . urlencode( $_GET['key'] ) . '&login=' . urlencode( $_GET['login'] ), 'login_post' );
        wp_redirect( $url );
        exit;
    }
}

しかし、これで私はリダイレクトループに陥ります。

フォームのアクションURLでページにアクセスしたときに、ブラウザのアドレスバーにURLをきれいに表示させる方法はありますか。

私は本当にどんなヒントでも感謝します。

ありがとう、ダーシャ

3
dashaluna

ステップ2.ただし、不一致のパスワードを送信すると、フォームが再表示され、URLが になります。 = zyx その動作が変更されたことに注意してください。

無効なキーでこれを試みると、 http://example.com/wp-login.php?action=lostpassword&error=invalidkey にリダイレクトされます。

とにかく、あなたがin_array( $action, array('rp', 'resetpass') )があなたがリダイレクトしているURLのために真のままであるという条件であるので無限ループは起こっています、それであなたはリダイレクトループに終わります。

解決策は、要求されたURLがリダイレクトURLと異なることを確認することです。

function pretty_login_urls_form_action_fix(){

    $action = isset( $_REQUEST['action'] ) ? $_REQUEST['action'] : '';
    if( in_array( $action, array('rp', 'resetpass') ) ){

        $requested_url  = is_ssl() ? 'https://' : 'http://';
        $requested_url .= $_SERVER['HTTP_Host'];
        $requested_url .= $_SERVER['REQUEST_URI'];

        $redirect_url = home_url( '/password-restore?action='. $action .'&key=' . urlencode( $_GET['key'] ) . '&login=' . urlencode( $_GET['login'] ), 'login_post' );

        if( $redirect_url !== $requested_url ){         
            wp_redirect( $redirect_url );
            exit;
        }
    }
}
1
Stephen Harris