サポート » プラグイン » contact form 7のメールアドレスのエラーをわかりやすくしたい

  • プラグイン「contactform7」でメールアドレスチェックのエラー文言はどんな時でも
    設定画面の文字列(初期値:入力されたメールアドレスに間違いがあります。)の
    1つに集約されて表示される。
    何故エラーメッセージが出たのかユーザーにわかりやすく提示したい。
    @が含まれなかった場合=@が入力されていません
    不正な文字が含まれた場合=半角英数字と「!#$%&\’*+\/=?^_`{|}~\.-」以外は入力不可です。
    など。。。。
    ソースコードを参照したところ、ワードプレスに元々備わっている「is_email()」という関数

    https://github.com/WordPress/wordpress-develop/blob/5.9/src/wp-includes/formatting.php#L3447-L3526

    が使われているようでしたので、この関数内でのif文に沿ってエラーメッセージを出し分けたいです。

    https://ja.wordpress.org/support/topic/contact-form-7でメールアドレスのチェックを厳格にしたい/#post-226741
    をみたところ、「wpcf7_validate_email」と「wpcf7_validate_email*」に
    フックとして関数を噛ませればいいことまでは分かったのですが、その先がわかりませんでした。

    よろしくお願いいたします。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • すでに示されているフックを使って処理することになります。
    それがわからない場合、何かあった場合に対処できなくなるので、このフックについてまずは勉強してみるのがよいかと思います。
    参考サイト
    https://coosy.co.jp/blog/wordpress-hook/
    https://syncer.jp/Web/WordPress/Reference/Function/apply_filters/

    また Contact Form 7 側の正式ヘルプは下記の通りです。
    https://contactform7.com/2015/03/28/custom-validation/

    で、
    https://ja.wordpress.org/support/topic/contact-form-7でメールアドレスのチェックを厳格にしたい/#post-226741
    のリンク先の解決事例のコードをまず読み解くところからしてみます。
    少しリンク先のコードは修正します。

    まずコードは、テーマの functions.php の一番下に追加するという形になります。

    Contact Form 7 は用意したフィルタ「wpcf7_validate_email」と「wpcf7_validate_email*」に対して、wpcf7_text_validation_filter 関数を実行するようにしています。

    modules/text.php:add_filter( ‘wpcf7_validate_email’, ‘wpcf7_text_validation_filter’, 10, 2 );
    modules/text.php:add_filter( ‘wpcf7_validate_email*’, ‘wpcf7_text_validation_filter’, 10, 2 );

    wpcf7_text_validation_filter 関数は、modules/text.phpにあるので、ここでエラーに関するメッセージをだしています。これが参考にする根底の部分です。

    で 「wpcf7_validate_email」と「wpcf7_validate_email*」の意味は、 Contact Form 7におけるタグの違い([email] か [email*] の違い)ということになります。つまり [text] に対してチェックをいれたければ、wpcf7_validate_text を指定せよということですね。

    add_filter(‘wpcf7_validate_email’, ‘wpcf7_validate_email_reject_nonrfcmail’, 11, 2);
    add_filter(‘wpcf7_validate_email*’, ‘wpcf7_validate_email_reject_nonrfcmail’, 11, 2);

    のように記述します。 11 は優先順位であり、デフォルトは10が指定されています。数が多いほうが後から実行されるということです。次の 2 については関数の引数は2つだよという宣言です。
    実際に、wpcf7_text_validation_filter 関数も引数は2つですし、それに合わせて下記の関数も引数を2つにします。

    あとは、$email にメールアドレスが入りますので、条件を分けてください。
    どう分けるかは、is_emailを参考にすればよいでしょう。ただしエラーメッセージの表示は
    $result->invalidate ($tag, “エラーメッセージの内容”);
    となるので、そこだけ気をつければ良いです。

    となると下記のようなコードになるかなぁとは思います(add_filter部分含む)。

    add_filter('wpcf7_validate_email', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
    add_filter('wpcf7_validate_email*', 'wpcf7_validate_email_reject_nonrfcmail', 11, 2);
    
    function wpcf7_validate_email_reject_nonrfcmail($result,$tag){
        $tag = new WPCF7_FormTag( $tag );
    
        $email = isset($_POST[$tag->name]) ? trim($_POST[$tag->name]) : '';
    
        if ( strlen( $email ) < 6 ) {
    	$result->invalidate ($tag, "エラーメッセージの内容");
        }
        if ( strpos( $email, '@', 1 ) === false ) {
    	$result->invalidate ($tag, "エラーメッセージの内容");
        }
        // あとは is_email の条件を追加していく
    
        return $result;
    }
    • この返信は4ヶ月、 1週前にkimipoohが編集しました。
    • この返信は4ヶ月、 1週前にkimipoohが編集しました。
    トピック投稿者 noardtyreuire

    (@noardtyreuire)

    kimipooh様
    ご丁寧にありがとうございます。
    理解できるように頑張ります。

2件の返信を表示中 - 1 - 2件目 (全2件中)
  • このトピックに返信するにはログインが必要です。