サポート » 使い方全般 » 新規会員登録できなくなり、直せない

  • 解決済 charinchi

    (@charinchi)


    お世話になります。
    WordPress 5.6.3 です。WordPress初心者です。
    子テーマにfunctions.phpを作成し、そこでユーザ登録関連で自動送信されるメールの文章のカスタマイズをおこなっております。
    ソースはネット上で見つけたものを解る範囲で加工して作成中です。

    ダッシュボードでユーザー新規登録をおこなって保存ボタンを押したところ、真っ白の画面に文章が掲載されるだけのエラー画面が出ました。デバッグせよとの表示が出て、サイトが使えなくなるのでは?と思い、恐ろしくなっております。
    メッセージは以下でした。

    「このサイトで重大なエラーが発生しました。対応手順については、サイト管理者のメール受信ボックスを確認してください。
    WordPress でのデバッグをさらに詳しく見る。」

    ちなみにメールは届いていませんでした。
    デバッグというものをおこなってlogをWebサーバに保存するように設定してみたところ、三つのエラーが出ました。そのうち一つは運が良くて解決できたのですが、残り二つが直せません。
    以下がエラーメッセージです。

    [26-Apr-2021 08:05:16 UTC] PHP Notice:  Undefined variable: user_login in /usr/home/myacout/html/wordpress/wp-content/themes/mytheme-child/functions.php on line 155
    [26-Apr-2021 08:05:16 UTC] PHP Notice:  Undefined variable: user_login in /usr/home/myacout/html/wordpress/wp-content/themes/mytheme-child/functions.php on line 181
    

    二つとも同じエラーの内容なので、一つ直せば二つ目も直るとは思うのですが、未定義の変数と書かれても何をどう直せば良いのか判らない状態です。
    以下が該当のソース箇所です(個人情報がわからにように編集しております。ご了承下さい)。
    どのようにして直せば再びユーザー登録が可能になるでしょうか。
    宜しくお願いします。

    
    /* 送信元のメールアドレスをカスタマイズ */
    function custom_mail_from( $email ) {
     return 'contact@mysite.jp';
    }
    add_filter( 'wp_mail_from', 'custom_mail_from' );
    
    /* 送信メールの差出人名をカスタマイズ */
    function custom_mail_from_name( $email_from ) {
     return 'MySiteName';
    }
    add_filter( 'wp_mail_from_name', 'custom_mail_from_name' );
    
    function custom_new_user_notification_email( $new_user_notification_email, $user, $blogname ) {
    
    $subject = '【' . $blogname . '】ユーザーアカウント発行のお知らせ';
    
    $user_name = stripslashes( $user->user_login );
    $user_email = stripslashes( $user->user_email );
    
    $message = $user_name . ' 様' . "\r\n";
    $message .= "\r\n";
    $message .= '「' . $blogname . '」の' . "\r\n";
    $message .= 'ユーザーアカウントを発行いたしましたので、お知らせします。' . "\r\n";
    $message .= "\r\n";
    $message .= 'ユーザー名  :' . $user_name . "\r\n";
    $message .= 'メールアドレス:' . $user_email . "\r\n";
    $message .= "\r\n";
    $message .= 'まずはじめに、以下の「パスワードリセット(変更)URL」の画面で' . "\r\n";
    $message .= 'お客様独自のパスワードへ変更する手続きをおこないます。' . "\r\n";
    $message .= "\r\n";
    $message .= '・パスワードリセット(変更)URL' . "\r\n";
    $message .= network_site_url( "wp-login.php?action=lostpassword" . rawurlencode( $user_login ), 'login' ) . "\r\n";
    $message .= "\r\n";
    $message .= "\r\n";
    $message .= '[2] ' . $blogname . ' へログインする' . "\r\n";
    $message .= "\r\n";
    $message .= 'パスワードのリセット(変更)が完了したら、以下の「ログインURL」を開いて' . "\r\n";
    $message .= 'ID(ご登録メールアドレス または ユーザー名)と変更したパスワード、' . "\r\n";
    $message .= 'を入力してログインします。' . "\r\n";
    $message .= "\r\n";
    $message .= '・ログインURL' . "\r\n";
    $message .= network_site_url( "wp-login.php" . rawurlencode( $user_login ), 'login' ) . "\r\n";
    $message .= "\r\n";
    
    //件名とメッセージを表示
    $new_user_notification_email[ 'subject' ] = $subject;
    $new_user_notification_email[ 'message' ] = $message;
    return $new_user_notification_email;
    }
    add_filter( 'wp_new_user_notification_email', 'custom_new_user_notification_email', 10 , 3 );
    
    • このトピックはcharinchiが2年、 11ヶ月前に変更しました。
    • このトピックはcharinchiが2年、 11ヶ月前に変更しました。
15件の返信を表示中 - 1 - 15件目 (全20件中)
  • トピック投稿者 charinchi

    (@charinchi)

    本件、難しい内容なのだと認識いたしましたので解決済みではないですが解決処理させて頂きます。
    お手数おかけして申し訳有りません。削除したいのですが削除方法がわかりません。問い合わせをして削除してもらえるか尋ねてみます。

    こんにちは

    どこかのサイトのコードを参考にされたと思いますが、そのコードには
    $user_login = $user_data->user_login;
    という記述がどこかにないでしょうか。
    追加してみてください。

    私はその参考ページのコードや張られているコードにこれを追加してうまく動くかはわかりません。

    トピック投稿者 charinchi

    (@charinchi)

    ご回答まことに有難う御座います。
    自身のソースともともとのソースも見たのですが、
    $user_login = $user_data->user_login;

    この記述が見つからない状況です。
    今回のソースは以下のサイトのソースをカスタマイズして作成しておりますが、
    会員登録時のメールにはもともとパスワードリセット用のURLもログインURLもありませんでしたが、
    当方は文中に必要だったため、別のパスワードリセットメールのソースから
    動的リンク記述部分を複製移植しました。
    よく見ると、ユーザー名の変数名が違っていますね・・・
    新規会員登録の方は「$user_name」となっているのに、パスワードリセットの方は「$user_login」となっています。
    なぜ同じユーザー名なのに変数名を違うものにしているのでしょうか・・・
    同じ著者が同じページで書いているのにわざわざ違う変数名にするのには訳があるはずで、単にどちらのユーザー名も同じ名称にしただけでは何か問題があるに違いないのですが、それが何なのかわからない状況です・・・
    単純に、「$user_login」と書かれてある箇所をすべて「$user_name」へ書き換えるだけで問題は出ないのでしょうか。

    https://mirai-creators.com/10496/

    ■上記URLの中で紹介されていた、管理者が新規会員登録して会員に届くメール(元ネタ)

    /* 会員登録時に「登録者」へ送信されるメールをカスタマイズ */
    function custom_new_user_notification_email( $new_user_notification_email, $user, $blogname ) {
     
     //件名を編集
     $subject = '会員登録完了のお知らせ【サイト名】';
     
     //ユーザー情報を取得
     $user_name = stripslashes( $user->user_login );
     $user_email = stripslashes( $user->user_email );
     
     //メッセージを編集
     $message = $user_name . ' 様' . "\r\n";
     $message .= "\r\n";
     $message .= $blogname . 'にご登録いただき、誠にありがとうございます。' . "\r\n";
     $message .= '会員登録が完了いたしましたので、ご連絡を申し上げます。' . "\r\n";
     $message .= "\r\n";
     $message .= '下記の登録情報をご確認のうえ、サイトにログインしてください。' . "\r\n";
     $message .= "\r\n";
     $message .= 'ユーザー名:' . $user_name . "\r\n";
     $message .= 'メールアドレス:' . $user_email;
     
     //件名とメッセージを表示
     $new_user_notification_email[ 'subject' ] = $subject;
     $new_user_notification_email[ 'message' ] = $message;
     return $new_user_notification_email;
    }
    add_filter( 'wp_new_user_notification_email', 'custom_new_user_notification_email', 10 , 3 );

    ■↓は上記のソースを加工して作成したもの

    function custom_new_user_notification_email( $new_user_notification_email, $user, $blogname ) {
    
    $subject = '【' . $blogname . '】ユーザーアカウント発行のお知らせ';
    
    $user_name = stripslashes( $user->user_login );
    $user_email = stripslashes( $user->user_email );
    
    $message = $user_name . ' 様' . "\r\n";
    $message .= "\r\n";
    $message .= '「' . $blogname . '」の' . "\r\n";
    $message .= 'ユーザーアカウントを発行いたしましたので、お知らせします。' . "\r\n";
    $message .= "\r\n";
    $message .= 'ユーザー名  :' . $user_name . "\r\n";
    $message .= 'メールアドレス:' . $user_email . "\r\n";
    $message .= "\r\n";
    $message .= 'まずはじめに、以下の「パスワードリセット(変更)URL」の画面で' . "\r\n";
    $message .= 'お客様独自のパスワードへ変更する手続きをおこないます。' . "\r\n";
    $message .= "\r\n";
    $message .= '・パスワードリセット(変更)URL' . "\r\n";
    $message .= network_site_url( "wp-login.php?action=lostpassword" . rawurlencode( $user_login ), 'login' ) . "\r\n";
    $message .= "\r\n";
    $message .= "\r\n";
    $message .= '[2] ' . $blogname . ' へログインする' . "\r\n";
    $message .= "\r\n";
    $message .= 'パスワードのリセット(変更)が完了したら、以下の「ログインURL」を開いて' . "\r\n";
    $message .= 'ID(ご登録メールアドレス または ユーザー名)と変更したパスワード、' . "\r\n";
    $message .= 'を入力してログインします。' . "\r\n";
    $message .= "\r\n";
    $message .= '・ログインURL' . "\r\n";
    $message .= network_site_url( "wp-login.php" . rawurlencode( $user_login ), 'login' ) . "\r\n";
    $message .= "\r\n";
    
    //件名とメッセージを表示
    $new_user_notification_email[ 'subject' ] = $subject;
    $new_user_notification_email[ 'message' ] = $message;
    return $new_user_notification_email;
    }
    add_filter( 'wp_new_user_notification_email', 'custom_new_user_notification_email', 10 , 3 );

    ■ちなみに、上記URLで紹介されていた、パスワードリセットメールのソース(元ネタ)
    ※ここから動的リンクの記載部分を複製移植しました。それが原因でユーザー名の違いが起こっているのですね・・・

    /* パスワードリセット時に「登録者」へ送信されるメールをカスタマイズ */
     
    /* 件名を設定 */
    function custom_retrieve_password_title( $title, $user_login, $user_data ) {
     $title = 'パスワードリセットのお知らせ【サイト名】';
     return $title;
    }
    add_filter( 'retrieve_password_title', 'custom_retrieve_password_title', 10, 3 );
     
    /* メッセージを設定 */
    function custom_retrieve_password_message( $message, $key, $user_login, $user_data ) {
     
     //サイト情報を取得
     $blogname = stripslashes( get_option( 'blogname' ) );
     
     //メッセージを編集
     $message = $user_login . ' 様' . "\r\n";
     $message .= "\r\n";
     $message .= 'あなたのアカウントに対して、パスワードのリセットが要求されました。' . "\r\n";
     $message .= "\r\n";
     $message .= 'もしこのリクエストが間違いだった場合は、このメールを無視してください。' . "\r\n";
     $message .= '何も操作をしなければ、これまでのパスワードがそのまま使用できます。' . "\r\n";
     $message .= "\r\n";
     $message .= 'パスワードをリセットする場合は、次のリンクをクリックしてください。' . "\r\n";
     $message .= 'パスワード変更画面にアクセスしますので、新しいパスワードを入力してください。' . "\r\n";
     $message .= "\r\n";
     $message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . "\r\n";
     $message .= "\r\n";
     $message .= $blogname;
     
     //メッセージを表示
     return $message;
    }
    add_filter( 'retrieve_password_message', 'custom_retrieve_password_message', 10, 4 );
    • この返信は2年、 11ヶ月前にcharinchiが編集しました。
    • この返信は2年、 11ヶ月前にcharinchiが編集しました。
    • この返信は2年、 11ヶ月前にcharinchiが編集しました。

    retrieve_password_messageフィルターフックでは何もしなくてもcustom_retrieve_password_message関数の引数に$user_loginがわたってきますが、wp_new_user_notification_emailフィルターフックではcustom_new_user_notification_email関数の引数に$user_loginがわたってきません。

    なので、関数の頭の方に$user_login = $user_data->user_login;と書いてみてください。

    トピック投稿者 charinchi

    (@charinchi)

    ありがとうございます!!
    フィルターフックによって自動的に引き渡す・引き渡さないという違いがあるのですか・・・。
    メールの性格によって不必要なものはカットしてあると理解いたしました。
    私は単にファンクション名のかっこの中に「, $user_login」と追加するだけで良いのかと思っていましたが、そんな機能分けがあるのですね・・・

    ソースを加工いたしました。明らかに関係しないところはカットして以下にまとめました。
    ただ、このままですと「$user_name」と「$user_login」が同居していますが、どちらかに統一しなくて良かったでしょうか。
    重ね重ね恐れ入ります。

    function custom_new_user_notification_email( $new_user_notification_email, $user, $blogname ) {
    
    $user_login = $user_data->user_login; // アドバイス頂き追加した
    
    $subject = '【' . $blogname . '】ユーザーアカウント発行のお知らせ';
    
    $user_name = stripslashes( $user->user_login );
    $user_email = stripslashes( $user->user_email );
    
    $message = $user_name . ' 様' . "\r\n";
    $message .= "\r\n";
    $message .= '「' . $blogname . '」の' . "\r\n";
    $message .= 'ユーザーアカウントを発行いたしましたので、お知らせします。' . "\r\n";
    $message .= "\r\n";
    $message .= 'ユーザー名  :' . $user_name . "\r\n";
    $message .= 'メールアドレス:' . $user_email . "\r\n";
    $message .= "\r\n";
    $message .= "\r\n";
    $message .= '・パスワードリセット(変更)URLは以下です。' . "\r\n";
    $message .= network_site_url( "wp-login.php?action=lostpassword" . rawurlencode( $user_login ), 'login' ) . "\r\n";
    $message .= "\r\n";
    $message .= "\r\n";
    $message .= '[2] ' . $blogname . ' へログインする' . "\r\n";
    $message .= "\r\n";
    $message .= 'パスワードのリセット(変更)が完了したら、以下の「ログインURL」を開いて' . "\r\n";
    $message .= "\r\n";
    $message .= '・ログインURLは以下です。' . "\r\n";
    $message .= network_site_url( "wp-login.php" . rawurlencode( $user_login ), 'login' ) . "\r\n";
    $message .= "\r\n";
    
    //件名とメッセージを表示
    $new_user_notification_email[ 'subject' ] = $subject;
    $new_user_notification_email[ 'message' ] = $message;
    return $new_user_notification_email;
    }
    add_filter( 'wp_new_user_notification_email', 'custom_new_user_notification_email', 10 , 3 );
    
    • この返信は2年、 11ヶ月前にcharinchiが編集しました。

    統一した方がすっきりすると思いますが、統一という意味では $user_name は stripslashes 関数を通っています。
    $user_loginrawurlencode をあらかじめ通しておいた方がコードとしては統一感があると思います。
    つまり

    $user_login = rawurlencode( $user_data->user_login );

    $message .= network_site_url( "wp-login.php?action=lostpassword" . $user_login, 'login' ) . "\r\n";

    トピック投稿者 charinchi

    (@charinchi)

    有難う御座います!<(_ _)>
    ということは、パスワードリセットメールの方も同様に統一すれば良いと理解いたしました。
    これで、今から新規会員登録とパスワードリセットの挙動を確認し、デバッグログも確認しようと存じます。

    /* パスワードリセット時に「登録者」へ送信されるメールをカスタマイズ */
     
    /* 件名を設定 */
    function custom_retrieve_password_title( $title, $user_login, $user_data ) {
     $title = 'パスワードリセットのお知らせ【サイト名】';
     return $title;
    }
    add_filter( 'retrieve_password_title', 'custom_retrieve_password_title', 10, 3 );
     
    /* メッセージを設定 */
    function custom_retrieve_password_message( $message, $key, $user_login, $user_data ) {
     
    $user_login = rawurlencode( $user_data->user_login ); // アドバイスで追加した箇所
    
     //サイト情報を取得
     $blogname = stripslashes( get_option( 'blogname' ) );
     
     //メッセージを編集
     $message = $user_login . ' 様' . "\r\n";
     $message .= "\r\n";
     $message .= 'あなたのアカウントに対して、パスワードのリセットが要求されました。' . "\r\n";
     $message .= "\r\n";
     $message .= 'パスワードをリセットする場合は、次のリンクをクリックしてください。' . "\r\n";
     $message .= "\r\n";
     $message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . $user_login, 'login' ) . "\r\n";
     $message .= $blogname;
     
     //メッセージを表示
     return $message;
    }
    add_filter( 'retrieve_password_message', 'custom_retrieve_password_message', 10, 4 );
    トピック投稿者 charinchi

    (@charinchi)

    functions.phpを保存して、新規会員登録をおこなってみたところ、デバッグログを見ると、
    以下のエラーが記載されておりました。
    207行目は、「$user_login = rawurlencode( $user_data->user_login );」の行です。

    [27-Apr-2021 08:47:21 UTC] PHP Notice:  Undefined variable: user_data in /usr/home/mysite/html/wordpress/wp-content/themes/mysite-child/functions.php on line 207
    [27-Apr-2021 08:47:21 UTC] PHP Notice:  Trying to get property 'user_login' of non-object in /usr/home/mysite/html/wordpress/wp-content/themes/mysite-child/functions.php on line 207
    

    すいません、混乱してきたのですが、この処理をするフックは wp_new_user_notification_email ですか?それともretrieve_password_messageですか?

    wp_new_user_notification_email の場合は第二引数がユーザーなので、最初に貼られたコードでいえば
    $user->user_login
    としてください。(間違っていました、すいません。)

    retrieve_password_message の場合は第三引数が$user_loginなので、それをそのまま使ってください。
    コードの追加は必要ありません。

    トピック投稿者 charinchi

    (@charinchi)

    続けて本当に有難う御座います。
    適用しましたが、なぜか新規会員登録時の自動メール(wp_new_user_notification_email)の方
    のリセットURLを開いたら、リセットURLにならず、単なるログイン画面が表示されます。
    ちょっと挙動をもう少し確認いたします。

    もともと、新規会員登録時の自動送信メールでエラーが起こりましたので、
    「wp_new_user_notification_email」の方ということになります。
    ここがmunyagu様のアドバイスのおかげで正常化したと思ったので、
    「retrieve_password_message(パスワードリセット時の自動送信メール)」も
    同じようにして正常化しようとしました。
    ※ですが、パスワードリセットメールのフックのほうは何もしなくても勝手に$user_loginを引き渡してくれる、というmunyagu様からの情報を忘れておりました。
    「wp_new_user_notification_email(新規会員登録メール)」と内容を揃えたら逆にエラーになるのですね。済みません、このことを忘れておりました。

    「wp_new_user_notification_email(新規会員登録メール)」
    で、
    $user_login = rawurlencode( $user->user_login );
    から、
    $user_login = rawurlencode( $user->user_login );
    へ変更し、
    「retrieve_password_message(パスワードリセット時の自動送信メール)」のソースで、
    $user_login = rawurlencode( $user->user_login );
    を削除し、URL部分も
    $message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . "\r\n";
    へ戻したところ、デバッグログからエラーが消えました。
    エラーは消えたのに、「wp_new_user_notification_email(新規会員登録メール)」のメール内の
    $message .= network_site_url( "wp-login.php?action=lostpassword" . $user_login, 'login' ) . "\r\n";
    が本来のURLが開いてくれない状態です。単なるログイン画面が表示されます。

    • この返信は2年、 11ヶ月前にcharinchiが編集しました。
    • この返信は2年、 11ヶ月前にcharinchiが編集しました。
    トピック投稿者 charinchi

    (@charinchi)

    やはり稼働しませんでした。

    「wp_new_user_notification_email(新規会員登録メール)」の文中に、
    $message .= network_site_url( "wp-login.php?action=lostpassword" . $user_login, 'login' ) . "\r\n";
    と、
    $message .= network_site_url( "wp-login.php?" . $user_login, 'login' ) . "\r\n";

    を記載しておりますが、下の方の単なるログイン画面が開くだけの方は正常にURLが開きました。

    しかし、上の方はパスワードリセットをするURLが開くはずがログイン画面が開きました。

    正常になっていた午前中のメールを見ると以下のURLになっていました。
    https://mysite.jp/wordpress/wp-login.php?action=rp&key=pzUIu4lur2wyLjMVLTxa&login=username01
    成功しなくなった今のURLは以下になっていました。
    https://mysite.jp/wordpress/wp-login.php?action=lostpasswordusername01

    このURLの記述部分である
    network_site_url( "wp-login.php?action=lostpassword"
    は、変更していないのですが何か間違ってしまったでしょうか。

    残念ながら、私はこれらのフィルターフックを使ったことがなく、どのようにしたら実現できるのかはよくわかりません。

    また、当初のエラーは修正されていて解決済みにされてしまってもいますので、新しいトピックを立てられたほうが広く回答を得られると思います。

    割り込み失礼します。

    パスワードリセットをする URL の部分は、下記のようなコードではどうでしょうか(未検証)。

    $message .= network_site_url( "wp-login.php?action=lostpassword" . $user_login, 'login' ) . "\r\n";

    $key = get_password_reset_key( $user );
    $message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . $user_login, 'login' ) . "\r\n";

    ※ 参照コード: wp-includes/pluggable.php (2085行目辺り)

    トピック投稿者 charinchi

    (@charinchi)

    @munyagu さま、内容了解いたしました、今までアドバイス頂き本当に有難うございました!

    @ishitaka さま、アドバイス大変助かります! 今、pluggable.php のあるフォルダをダウンロード中です。試してみます。
    この2行をそのまま続けて入れてみます。のちほど結果をご報告いたします。有難う御座います。

    pluggable.php を変更する訳ではないですよ。コードの参考です。

    この2行をそのまま続けて入れてみます。

    @charinchi さんの提示のコードの下記コード

    $message .= network_site_url( "wp-login.php?action=lostpassword" . $user_login, 'login' ) . "\r\n";

    $key = get_password_reset_key( $user );
    $message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . $user_login, 'login' ) . "\r\n";

    を、入れ替えです。

15件の返信を表示中 - 1 - 15件目 (全20件中)
  • トピック「新規会員登録できなくなり、直せない」には新たに返信することはできません。