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をきれいに表示させる方法はありますか。
私は本当にどんなヒントでも感謝します。
ありがとう、ダーシャ
ステップ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;
}
}
}