Contact Form 7에서 입력 값을 처리한 문자열을 자동 회신 메일에 부여

11482 단어 ContactForm7WordPress
WordPress의 Contact Form 7에서, 예를 들어 로그인을 위한 임시 비밀번호를 자동 회신 메일에 붙이고 싶은 것 같은데요.
그러한 경우에 예를 들어 hidden인 필드에 JS로 랜덤 캐릭터 라인을 생성해 두어 그것을 사용하는 것 같은 것을 하려고 하면,
  • 문자열을 스프레드 시트로 만들고 데이터베이스처럼 기억해야합니다.
  • 일정 기간 후에 지우는 것 같은 조작을 하지 않으면 무한하게 모여 간다
  • 로그인시에 대조를 하지 않으면 안 되는 것이 귀찮아
  • 클라이언트 측에 문자열을 생성하는 방법이 보이는 것은 기분 나쁘다

  • 그게 뭐야, ,,,

    이번에는 이를 피하기 위해 이메일 주소와 같은 계정 관련 정보의 해시 값을 사용하는 방법을 소개합니다.
    예상되는 흐름은 다음과 같습니다.
  • 메일 주소만으로 임시 등록 -> 본 등록용 URL이 메일로 회신된다
  • 이 등록 URL에서 추가 정보 (예 : 계정 이름)를 입력하십시오.

    (문외 한이므로 다른 모범 사례가 있으면 가르쳐 주었으면 합니다)


    임시 등록 양식 (ContactForm7)
    メールアドレス:
    [email* email]
    [submit "仮登録する"]
    



    임시 등록에 대한 회신 메일 본문 (ContactForm7)
    仮登録フォームからの自動返信メールです
    本登録URLはこちら
    https://example.com/application?secret-id=[secret-id]
    ※URL流出時のリスクが増えるが、ユーザー的にはemailも自動で入力されていてくれた方が嬉しいかもしれない
     -> https://example.com/application?secret-id=[secret-id]&email=[email]
    



    function.php
    // ハッシュ生成関数
    // $srcに応じて一意に決まるものならなんでも良い
    function wpcf7_make_hash($src) {
        // 単にハッシュするだけだと推測されるかもしれないので適当に何か固定のデータをくっつけとく
        return sha1("some-unguessable-string".$src);
    }
    // 仮登録用メール送信前フック
    add_action("wpcf7_before_send_mail", "wpcf7_replace_secret_id");
    function wpcf7_replace_secret_id($WPCF7_ContactForm) {
        // もしフォーム毎に処理を変えたいならid()をチェック
        if(your-form-id == $WPCF7_ContactForm->id()) {
            $wpcf7 = WPCF7_ContactForm::get_current();
            $submission = WPCF7_Submission::get_instance();
            if ($submission) {
                $data = $submission->get_posted_data();
                $secretID = wpcf7_make_hash($data['email']);
    
                $mail = $wpcf7->prop('mail'); // もし「メール2」の方を使うなら$mail = $wpcf7->prop('mail_2');
                // メール本文中の[secret-id]を$secretIDで置換
                $mail['body'] = str_replace('[secret-id]', $secretID, $mail['body']);
                $wpcf7->set_properties(array(
                    "mail" => $mail // "mail_2" => $mail
                ));
                return $wpcf7;
            }
        }
    }
    



    본 등록 양식 (ContactForm7)
    [hidden secret-id default:get readonly] // ここにURLクエリパラメータのsecret-idが入力される
    アカウント名:
    [text* account-name]
    メールアドレス:
    [email* email]
    ; [email* email default:get] // URLクエリパラメータにemailというデータがあれば自動入力される
    ; [hidden* email default:get] // 自動入力するなら、場合によってはhiddenでも良いかもしれない
    [submit "本登録する"]
    



    function.php
    // 本登録用バリデーション
    add_filter( 'wpcf7_validate', 'wpcf7_validation_login_with_tmp_secret_id', 11, 2 );
    function wpcf7_validation_login_with_tmp_secret_id( $result, $tags ) {
        // secret-idという値が存在しないなら関係ないフォーム
        if(is_null($_POST['secret-id'])) {
            return $result;
        }
        foreach( $tags as $tag ) {
            $name = $tag['name'];
            if($name == 'email') {
                // メールアドレスからハッシュを再生成して一致をチェック
                if(wpcf7_make_hash($_POST[$name]) != $_POST['secret-id']) {
                    $result->invalidate( $tag, '仮登録の返信メールに記載のURL以外からアクセスしているか、またはメールアドレスが間違っています。');
                }
                // 実用的には、登録済みメールアドレスかどうかのチェックもこのあたりに入れておきたい
            }
        }
        return $result;
    }
    

    참고로 한 페이지



    해시 문자열 생성 : htps //w w. php. 네 t / 마누아 l / 그럼 / 훙 c 치온. 샤 1. php
    메일 본문의 일부 대체 : htps //w w. 366세 rゔぃ세. 이 m/jp/쿠우/580아78아79에16c3193f02179822fb799d
    메일 2는 mail_2 : htps //w w. Ret t. 이 m/r/을 rdp 렛 s/코멘 ts/3hljb8/이런 ct_후 rm_7_도 ぢfy_마이 l_오 f_세콘 d_레시피엔 t/
    URL 매개 변수를 양식 항목에 자동 입력 : h tps : // 에카키 j. 코 m / wp - 난 ct - rm - 7 - 게 t 파라 r /
    양식 데이터의 사용자 지정 유효성 검사 : htps : // 이 m/kd9951/이고 ms/1717fc384c16에00d6458
  • 좋은 웹페이지 즐겨찾기