サポート » 使い方全般 » wp-login.phpでaction=lostpasswordのリンクを置き換えたい

  • 解決済 oobmwo

    (@matsui)


    wp-login.phpをhogehoge-login.phpに置き換えています。wp-login.phpへアクセスがあった場合には403を返すようにしています。

    hogehoge-login.php上で、「パスワードをお忘れですか?」をクリックするとhttp://hogehoge.com/hogehoge-login.php?action=lostpassword へジャンプししますが、「新しいパスワードを取得」をクリックしても、リンク先はhttp://hogehoge.com/wp-login.php?action=lostpasswordのままのため、エラーとなってしまいます。

    本来は、いっそのことユーザーによるパスワード再発行を不可のほうがよいのでしょうが、そうもいかないので、wp-login.phpの528行目のwp-login.phpの個所を以下のように書き換えました。
    <form name="lostpasswordform" id="lostpasswordform" action="<?php echo esc_url( network_site_url( 'hogehoge-login.php?action=lostpassword', 'login_post' ) ); ?>" method="post">

    wp-login.phpを直接書き換えるのではなく、functions.phpへの記載で当該個所を自動的に置き換えるようにしたいのですが、記述方法がわかりません。
    どなたかご教授いただけませんでしょうか。
    よろしくお願いいたします。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • wp-login.phpを直接書き換えるのではなく、functions.phpへの記載で当該個所を自動的に置き換えるようにしたいのですが、記述方法がわかりません。

    そういう方法はないと思いますよ。

    モデレーター gatespace

    (@gatespace)

    別解として。

    wp-login.php を書き換えるのはやめた方が良いです。
    コアファイルは改変しない方が良いのはもちろんですが、ログイン時のリダイレクトなど影響範囲が大きいです。

    なぜ wp-login.php ではダメなのでしょうか?

    もし、ログイン画面への不正アクセスなどを心配されているのであれば、
    ログイン画面とダッシュボードをIPアドレスやBasic認証で制限する方がよっぽど簡単ですが。

    トピック投稿者 oobmwo

    (@matsui)

    gblsm様、gatespace様返信ありがとうございます。
    wp-login.phpを直接書き換えることはしたくないと考えています。
    しかし、諸事情でgatespace様がご指摘されている制限方法も利用したくない状況です。

    そのため以下と同様の方法で、wp-login.phpを残したまま、hogehoge-login.phpとして使っています。(wp-login.phpは削除できない)

    ログインページを変える

    「パスワードをお忘れですか ?」を使わせないのであれば、それ以上手を加える必要もありませんので、特にこちらで質問をさせていただく必要もなかったのですが、

    同時に「パスワードをお忘れですか?」を使う必要が出てきてしまい、弱っていたところです。

    諸事情により、リンク先のサイトを見ることができないので、想像ですが、matsui さんの書き換えだけで何とかなっているということは、たぶん、login、logout、registration などのリダイレクト処理は、フィルタを使って処理しているのでしょう (それ以外の方法は思いつきません)。何のためにそんなことをするのかは理解できませんけど。

    さて、該当の場所ですが、

    network_site_url('wp-login.php?action=lostpassword', 'login_post')

    というのがもとのコードですから、同じようにフィルタを使えばいいのではないでしょうか。

    また、別の方法として、JavaScript を使うこともできます。jQuery を使うなら、object.attr(name, value)、素の JavaScript なら、element.setAttribute(name, value) とするだけです。

    モデレーター gatespace

    (@gatespace)

    まぁ、もう一つ別案を。

    まず、今のをやめる。

    次に「Theme My Login」を使って固定ページにログインページを設置する。
    https://wordpress.org/plugins/theme-my-login/

    wp-login.php は、.htaccess なりで 403 返すようにする。
    もしくは wp-login.php には BASIC認証かけて一般ユーザは使えないようにする。

    要検証で。

    matsui様
    ご迷惑をおかけしております。

    プラグインLogin rebuilderを利用されているかと思いますが、
    kjmtsh様の指摘通り、プラグインにて’site_url’フィルターを利用し
    URLの書き換えを行っているのですが、そこでwp-login.phpの
    パラメータ付きを無視していたため、パラメータ付きのURLの
    書き換えが行われず、結果的にパスワードリセットの動作が行えない
    状態でした。

    こちらの不具合について対処を行い、そのほかへの影響がないか
    検証しております。
    この3連休中に改訂版をリリースできる見込みです。

    早急にということであればgatespace様の案通りの対応でよろしいかと
    思います。

    取り急ぎ。

    トピック投稿者 oobmwo

    (@matsui)

    kjmtshさま
    gatespaceさま
    tmatsuurさま

    御丁寧な返信・別案の提案ありがとうございます。
    Basic認証は利用しておりましたが、どうも当方のユーザーに評判が悪く断念した経緯があります。

    そして、tmatsuurさま、ご迷惑などとんでもない。ただ、感謝するばかりです。

    今回はリンク先の記事と同じようのfunction.phpの変更+wp-login.phpの別名ファイルを作成する方法の2通りで運用しています。

    プラグイン化されたLogin rebuilderの利用するサイト(マルチサイトのブログの場合など)もあるのですが、本件の質問環境ではプラグインは利用しておりません。

    tmatsuurさまのお考えで「パスワードをお忘れですか」はあえて使用させない形にしているのでは?と考えていたので、functions.phpでフィルタフックなど他の解決策はないものかとこちらで質問させていただいた次第です。

    最後に、tmatsuurさまにお願いなのですが、もしも可能でしたらプラグインを使わない場合での修正方法についても合わせてご案内いただけませんでしょうか。

    本件、早急にという内容ではありませんので、ぼちぼちで結構です。
    ご検討下されば幸いです。

    こんにちは。
    「新しいパスワードを取得」フォームのPOST先を変更、という条件のみでしたら下記のコードでどうでしょう。

    functions.php へ

    add_action( 'lost_password', 'form_action_change_ob_start' );
    function form_action_change_ob_start() {
    	ob_start();
    }
    
    //  'wp-login.php' を 'hogehoge-login.php' に書き換え
    add_action( 'lostpassword_form', 'form_action_change' );
    function form_action_change() {
    	$form = ob_get_contents();
    	ob_end_clean();
    	$form = str_replace( 'wp-login.php', 'hogehoge-login.php', $form);
    	echo $form;
    }

    ただし、このままですと フォーム下部の「ログイン」のリンクは、http://example.com/wp-login.php のままです。

    もしこのリンクも書き換えたいのであれば、二つ目の関数を下記のようにすればよいかと思います。

    add_action( 'login_footer', 'form_action_change' );
    function form_action_change() {
    	if ( ! filter_input(INPUT_GET, 'action') ) {
    		return false;
    	}
    	if ( 'lostpassword' !== $_GET['action'] ) {
    		return false;
    	}
    
    	$form = ob_get_contents();
    	ob_end_clean();
    	$form = str_replace( 'wp-login.php', 'hogehoge-login.php', $form);
    	echo $form;
    }

    関数名は格好いいのに替えてください。。。

    matsuis様

    >tmatsuurさまのお考えで「パスワードをお忘れですか」はあえて使用させない形に
    >しているのでは?と考えていたので、functions.phpでフィルタフックなど他の
    >解決策はないものかとこちらで質問させていただいた次第です。
    これは検証不足で生じたバグですね。

    >最後に、tmatsuurさまにお願いなのですが、もしも可能でしたらプラグインを
    >使わない場合での修正方法についても合わせてご案内いただけませんでしょうか。
    こちらはサンプルコード内にanywhere_login_site_url関数がありますが、
    次のif文
    if ( $path == 'wp-login.php' &&

    if ( ( $path == 'wp-login.php' || preg_match( '/wp-login\.php\?action=\w+/', $path ) ) &&
    のように変更してみてください。
    正規表現を工夫すればpreg_match関数だけで判定できると思いますが、とりあえずは
    これで不具合は解消するはずです。

    トピック投稿者 oobmwo

    (@matsui)

    LVP8さま ありがとうございます。
    質問の段階で知りたかったのはまさに記載していただいたような内容です。
    勉強のため、検証してみたいと思っています。

    tmatsuurさま
    早速のコードのご提案ありがとうございます。
    ご提案いただいたコードにて、動作の確認ができました。

    プラグインの方の修正が完了した際には、そちらも検証しようと思っています。
    本当にありがとうございます。こちらでもご報告させていただきます。

    トピック投稿者 oobmwo

    (@matsui)

    tmatsuur様

    お世話になっております。
    Login rebuilder 1.3.1について

    遅くなりましたが、マルチサイトで、各ブログにlogin.phpの代替ログインファイルを設けている環境でも、パスワードリセットが問題なく運用できることを確認しました。
    (修正前はルートになるブログのみlogin.phpの代替ログインファイルを設けないという方法で問題を回避していました)

    本当にありがとうございました。
    これで本トピックをクローズとさせていただきたいと思います。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • トピック「wp-login.phpでaction=lostpasswordのリンクを置き換えたい」には新たに返信することはできません。