web-dev-qa-db-ja.com

お問い合わせフォーム7-カスタム検証

小文字ASCII文字と数字のみを受け入れるには、1つのフィールド(「インスタンス」と呼ばれる)のみを検証する必要があります。最初の文字も数字ではなく文字である必要があります。大文字を受け入れますが、入力時に小文字にするために必要になります。したがって、誰かがインスタンス名McDonaldsを使用すると、(CSSだけでなく)mcdonaldsに小文字になります。スペースも許可されません。

これはCF7で可能ですか?もしそうなら、その方法を説明してください。

私はすでに this カスタム検証方法を試しましたが、ファイルに事前設定されたカスタム検証があっても、フィールド自体ではなく、フィールドのショートコードを表示するだけでした。

ありがとう

6
mazecreative

From contactform7.com onCustom Validation→Validationas a Filter

Contact Form 7では、ユーザー入力の検証がフィルター機能として実装されています。検証に使用されるフィルターフックは、フォームタグのタイプによって異なり、wpcf7_validate_ + {フォームタグのタイプ}として決定されます。したがって、テキストフォームタグの場合、フィルターフックwpcf7_validate_textが使用されます。同様に、wpcf7_validate_email *はemail *フォームタグに使用されます。

フォームに次のメールフィールドがあるとします。

  Email:         [email* your-email]
  Confirm email: [email* your-email-confirm]

次のリストは、2つのフィールドの値が同じであるかどうかを確認するコードを示しています。

add_filter('wpcf7_validate_email*', 'custom_email_confirmation_validation_filter', 20, 2);

function custom_email_confirmation_validation_filter($result, $tag) {
    $tag = new WPCF7_Shortcode($tag);

    if ('your-email-confirm' == $tag->name) {
        $your_email = isset($_POST['your-email']) ? trim($_POST['your-email']) : '';
        $your_email_confirm = isset($_POST['your-email-confirm']) ? trim($_POST['your-email-confirm']) : '';

        if ($your_email != $your_email_confirm) {
            $result->invalidate($tag, "Are you sure this is the correct address?");
        }
    }
    return $result;
}

$ resultと$ tagの2つのパラメーターがフィルター関数に渡されます。 $ resultは、一連の検証プロセスを管理するWPCF7_Validationクラスのインスタンスです。 $ tagは、指定されたフォームタグコンポーネントで構成される連想配列です。前のレシピで見たように、WPCF7_Shortcodeクラスを使用してこのタイプのデータを処理できます。

フィルタ機能の内部を確認してください。まず、フォームタグの名前をチェックして、検証が特定のフィールド(your-email-confirm)にのみ適用されることを確認します。

次に、2つのメールフィールドの値が比較され、一致しない場合は、$ result-> invalidate()が呼び出されます。 2つのパラメーターをinvalidate()メソッドに渡す必要があります。最初のパラメーターは$ tag変数である必要があり、2番目のパラメーターはフィールドに表示する検証エラーメッセージです。

最後に、$ resultを返すことを忘れないでください。

8
Zafar S

add_filter関数を使用して、フォームフィールド入力に独自のカスタム検証を追加できます。

textareaフィールドのカスタム検証を追加するには、テーマのルートディレクトリのfunctions.phpファイル内に次のものを追加できます。

add_filter( 'wpcf7_validate_textarea*', 'custom_textarea_validation_filter', 1, 2 );

function custom_textarea_validation_filter( $result, $tag ) {
  $tag = new WPCF7_Shortcode($tag);
  $result = (object)$result;

  $name = 'project-synopsis';

  if ( $name == $tag->name ) {
    $project_synopsis = isset( $_POST[$name] ) ? trim( wp_unslash( (string) $_POST[$name] ) ) : '';

    if ( empty( $project_synopsis ) ) {
      $result->invalidate( $tag, "Please write a quick project synopsis." );
    }
  }

  return $result;
}

エラーメッセージを追加するために使用されるinvalidateメソッドはキャストする前に機能しなかったため、私にとってのトリックは$resultパラメーターをオブジェクトにキャストすることでした。

2
Mosab Muhammad

名前フィールドの検証についても同様の問題がありました。functions.phpに次のコードを追加しました。正規表現を変更することでカスタマイズできます。

function my_wpcf7_validate_text( $result, $tag ) {

    $type = $tag['type'];
    $name = $tag['name'];
    $value = $_POST[$name] ;

    if ( strpos( $name , 'name' ) !== false ){
        $regex = '/^[a-zA-Z]+$/';
        $Valid = preg_match($regex,  $value, $matches );
        if ( $Valid > 0 ) {
        } else {
            $result->invalidate( $tag, wpcf7_get_message( 'invalid_name' ) );
        }
    }
    return $result;
}
add_filter( 'wpcf7_validate_text*', 'my_wpcf7_validate_text' , 10, 2 );

add_filter( 'wpcf7_messages', 'mywpcf7_text_messages' );
function mywpcf7_text_messages( $messages ) {
    return array_merge( $messages, array(
        'invalid_name' => array(
            'description' => __( "Name is invalid", 'contact-form-7' ),
            'default' => __( 'Name seems invalid.', 'contact-form-7' )
        )
    ));
}
1
Vidhu

これを使用してくださいwordpressプラグイン

お問い合わせフォーム7のJquery検証 https://wordpress.org/plugins/jquery-validation-for-contact-form-7/

1
formygalaxy

// CF7フォームフィールドのカスタム検証を追加します

function is_company_email($email){ // Check against list of common public email providers & return true if the email provided *doesn't* match one of them
        if(
                preg_match('/@gmail.com/i', $email) ||
                preg_match('/@hotmail.com/i', $email) ||
                preg_match('/@live.com/i', $email) ||
                preg_match('/@msn.com/i', $email) ||
                preg_match('/@aol.com/i', $email) ||
                preg_match('/@yahoo.com/i', $email) ||
                preg_match('/@inbox.com/i', $email) ||
                preg_match('/@gmx.com/i', $email) ||
                preg_match('/@me.com/i', $email)
        ){
                return false; // It's a publicly available email address
        }else{
                return true; // It's probably a company email address
        }
}
function your_validation_filter_func($result,$tag){
        $type = $tag['type'];
        $name = $tag['name'];
        if('yourid' == $value){ // Only apply to fields with the form field name of "company-email"
                $the_value = $_POST[$name];
                if(!is_company_email($the_value)){ // Isn't a company email address (it matched the list of free email providers)
                        $result['valid'] = false;
                        $result->invalidate( $tag, wpcf7_get_message( 'invalid_email' ));
                }
        }
        return $result;
}

 add_filter( 'wpcf7_validate_email', 'your_validation_filter_func', 10, 2 ); 

// Email field or contact number field
  add_filter( 'wpcf7_validate_email*', 'your_validation_filter_func', 10, 2 );     // Req. Email field or contact number
1
Raks