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?
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' );
}
É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!
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!
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!