web-dev-qa-db-fra.com

Validation personnalisée des champs de paiement WooCommerce

Je voudrais ajouter ma propre expression régulière pour valider le numéro de téléphone. Dans mon class-wc-validation.php J'ai modifié l'expression régulière selon mes besoins.

public static function is_phone( $phone ) {
    //if ( strlen( trim( preg_replace( '/[\s\#0-9_\-\+\(\)]/', '', $phone ) ) ) > 0 )
    if ( strlen( trim( preg_replace( '/^[6789]\d{9}$/', '', $phone ) ) ) > 0 )
        return false;

    return true;
}

Mais la validation n'a pas lieu. Qu'est-ce que je rate?

9
Philomath

Je n'ai pas vu votre code qui les connecte au flux de paiement woocommerce. veuillez vérifier leur documentation sur

woocommerce_checkout_process et woocommerce_checkout_order_processed

Mais dans votre cas, je vous suggère fortement de le brancher sur woocommerce_checkout_process

alors mettez ces codes ci-dessous sur votre functions.php sur votre thème, ou créez vos propres plugins woocommerce, et mettez-les dans le code bootstrap.

add_action('woocommerce_checkout_process', 'is_phone');

function is_phone() { 
    $phone_number = $_POST['---your-phone-field-name---'];
    // your function's body above, and if error, call this wc_add_notice
    wc_add_notice( __( 'Your phone number is wrong.' ), 'error' );
}
14
r4ccoon

Était confronté au même problème et a suivi ce que d'autres avaient dit ici, mais Woocommerce ne définit les erreurs lors de la validation qu'après woocommerce_checkout_process crochet.

Mais, dans le dernier Woocommerce 3.0 (je ne sais pas si c'est dans la version 2.x), nous pouvons utiliser le woocommerce_after_checkout_validation crochet, puis examinez le $data param si vous utilisez les champs de paiement standard ou utilisez $_POST si vous avez des champs personnalisés qui ne sont pas ajoutés de la manière standard de Woocommerce. Un exemple du code est:

public function validate($data,$errors) { 
    // Do your data processing here and in case of an 
    // error add it to the errors array like:
        $errors->add( 'validation', __( 'Please input that correctly.' ));
}
add_action('woocommerce_after_checkout_validation', 'validate',10,2);

J'espère que cela pourra aider!

11
sraman

Vous ne devez pas modifier les fichiers de plugin , car si vous mettez à jour le plugin, toute la personnalisation sera perdue, vous pouvez plutôt utiliser le hook pour atteindre votre objectif. Vous pouvez utiliser l'aide de woocommerce_checkout_process crochet pour ce faire.

Voici le code:

add_action('woocommerce_checkout_process', 'wh_phoneValidateCheckoutFields');

function wh_phoneValidateCheckoutFields() {
    $billing_phone = filter_input(INPUT_POST, 'billing_phone');

    if (strlen(trim(preg_replace('/^[6789]\d{9}$/', '', $billing_phone))) > 0) {
        wc_add_notice(__('Invalid <strong>Phone Number</strong>, please check your input.'), 'error');
    }
}

Le code va dans functions.php fichier de votre thème enfant (ou thème) actif. Ou aussi dans n'importe quel plugin PHP.

Veuillez noter: Par défaut, WooCommerce utilise billing_phone champ pour prendre le numéro de téléphone, mais si vous l'avez personnalisé, vous pouvez remplacer billing_phone avec le nom de votre champ.

J'espère que cela t'aides!

6
Raunak Gupta

Dans votre question, vous dites que la règle de validation ne fonctionne pas et je suppose qu'elle est écrite de manière erronée. Vous pouvez le tester en ligne avec des outils d'expression rationnelle, par exemple Regex101 ou autres.

Pour répondre de manière plus générale à ce sujet, la modification des règles de validation en toute sécurité peut être effectuée de cette façon:

Faites une copie de class-wc-validation.php dans votre répertoire de thèmes dans your_theme_path/woocommerce/includes/class-wc-validation.php et personnalisez les règles de validation.

Ensuite, vous devez créer une règle de validation pour le téléphone déposé dans checkout.js sinon votre champ aura toujours une bordure verte bien qu'il ne soit pas valide.

Ma solution a donc été d'ajouter un validateur d'expressions régulières personnalisé à checkout.js à propos de la ligne 192:

    if ( $parent.is( '.validate-phone' ) ) {
            if ( $this.val() ) {

                var pattern = new RegExp(/^([0-9\s\/\+\-\#\_\(\)]*)$/);

                if ( ! pattern.test( $this.val()  ) ) {
                    $parent.removeClass( 'woocommerce-validated' ).addClass( 'woocommerce-invalid woocommerce-invalid-phone' );
                    validated = false;
                }
            }
        }

Et incluez votre fichier .js personnalisé (dans functions.php)

add_action( 'wp_enqueue_scripts', 'my_checkoutjs_enqueue_scripts', 100 );

function gv_checkoutjs_enqueue_scripts() {

if ( is_checkout() ) {
    wp_deregister_script( 'wc-checkout' );
    wp_enqueue_script( 'wc-checkout', get_template_directory_uri() . '/js/modified_checkout.js', array( 'jquery', 'woocommerce', 'wc-country-select', 'wc-address-i18n' ) );
}}

J'espère que cela t'aides!

1
Arkady