Validation des champs personnalisés du transporteur dans la page de paiement de Woocommerce

J’ai ajouté deux champs de saisie personnalisés dans la section des méthodes d’expédition en modifiant le modèle /genesis-sample/woocommerce/checkout/review-order.php J’ai également réussi à les obtenir conditionnellement. Ce n’est que lorsque le bouton radio spécifique est coché que les champs de saisie apparaissent et deviennent obligatoires. J’utilise le code jQuery pour que les champs apparaissent et disparaissent. Tout cela fonctionne bien. Le code est ici:

 if ( isset($_POST['shipping_method_0_legacy_local_pickup']) && $_POST['shipping_method_0_legacy_local_pickup'] == 1 ) { $cheq = 'true'; } else { $cheq = 'false'; } woocommerce_form_field( 'fieldtester1' , array( 'type' => 'text', 'class' => array('wccs-field-class wccs-form-row-wide blahblah1'), 'label' => 'Enter Your Carrier Name', 'required' => $cheq, 'placeholder' => 'Carrier Name', ), $checkout->get_value( 'fieldtester1' )); woocommerce_form_field( 'fieldtester2' , array( 'type' => 'text', 'class' => array('wccs-field-class wccs-form-row-wide blahblah2'), 'label' => 'Enter Your Carrier Account #', 'required' => $cheq, 'placeholder' => 'Carrier Number', ), $checkout->get_value( 'fieldtester2' )); 

Mais voici le problème: même si l’atsortingbut required défini sur true pour les deux champs, la validation ne se produit pas si le champ est vide lorsque le bouton Place Order est activé. Idéalement, la commande ne devrait pas passer et un message d’erreur devrait être généré. J’ai déjà ajouté le code suivant dans functions.php pour forcer la validation du champ de saisie, mais cela ne fait rien. Le code est ici:

 add_action('woocommerce_checkout_process', 'carrier_checkout_process'); function carrier_checkout_process() { if ( isset($_POST['shipping_method_0_legacy_local_pickup']) && $_POST['shipping_method_0_legacy_local_pickup'] == 1 ) { if( empty( $_POST['fieldtester1'] ) ) { wc_add_notice( ( "Please don't forget to enter your shipping carrier details." ), "error" ); } } } 

Alors, voici ce que je recherche:

  1. quelqu’un peut-il m’aider à forcer la validation de deux champs de saisie que j’ai ajoutés?
  2. Après la validation, j’aimerais également append ces deux champs dans le nouvel email de commande et les détails de la commande dans le tableau de bord WordPress.

Si vous vous demandez pourquoi je n’utilise pas de point d’ancrage Woocommerce pour append des champs de saisie en premier lieu … Je n’ajoute pas les champs au formulaire de commande afin que les points d’accroche ne soient d’aucune aide. Les champs sont ajoutés dans la section Méthode d’expédition. Une autre raison était que je voulais mettre à jour l’atsortingbut required chaque fois qu’un utilisateur changerait de méthode d’expédition. Utiliser Jquery pour modifier l’atsortingbut required ne fonctionnait pas pour une raison quelconque, croyez-moi, j’ai essayé pendant deux jours. Quoi qu’il en soit, cette partie fonctionne déjà. Les seuls problèmes consistent à obtenir les champs à valider et à les append aux courriels et aux détails de la commande. J’ai jeté un coup d’œil un peu partout et l’aide la plus proche m’a été fournie par ce message où LoicTheAztec a donné une solution détaillée

Cela peut être fait sans jQuery en utilisant un hook spécial qui affichera vos deux champs personnalisés “Carrier” sous la méthode d’envoi legacy_local_pickup quand il est sélectionné. Si le client change de méthode d’expédition, ces champs seront supprimés.

Donc, vous devriez avoir besoin de supprimer votre modèle personnalisé et tout le code associé avant.

Maintenant, la validation fonctionne parfaitement et lorsque les champs personnalisés “Opérateur” sont renseignés, ils sont enregistrés dans les métadonnées de la commande.

 // Add custom fields to a specific selected shipping method add_action( 'woocommerce_after_shipping_rate', 'carrier_custom_fields', 20, 2 ); function carrier_custom_fields( $method, $index ) { if( ! is_checkout()) return; // Only on checkout page $customer_carrier_method = 'legacy_local_pickup'; if( $method->id != $customer_carrier_method ) return; // Only display for "local_pickup" $chosen_method_id = WC()->session->chosen_shipping_methods[ $index ]; // If the chosen shipping method is 'legacy_local_pickup' we display if($chosen_method_id == $customer_carrier_method ): echo '
'; woocommerce_form_field( 'carrier_name' , array( 'type' => 'text', 'class' => array('form-row-wide carrier-name'), 'label' => 'Carrier Information:', 'required' => true, 'placeholder' => 'Carrier Name', ), WC()->checkout->get_value( 'carrier_name' )); woocommerce_form_field( 'carrier_number' , array( 'type' => 'text', 'class' => array('form-row-wide carrier-number'), 'required' => true, 'placeholder' => 'Carrier Number', ), WC()->checkout->get_value( 'carrier_number' )); echo '
'; endif; } // Check custom fields validation add_action('woocommerce_checkout_process', 'carrier_checkout_process'); function carrier_checkout_process() { if( isset( $_POST['carrier_name'] ) && empty( $_POST['carrier_name'] ) ) wc_add_notice( ( "Please don't forget to enter the shipping carrier name." ), "error" ); if( isset( $_POST['carrier_number'] ) && empty( $_POST['carrier_number'] ) ) wc_add_notice( ( "Please don't forget to enter the shipping carrier account number." ), "error" ); } // Save custom fields to order meta data add_action( 'woocommerce_checkout_update_order_meta', 'carrier_update_order_meta', 30, 1 ); function carrier_update_order_meta( $order_id ) { if( isset( $_POST['carrier_name'] )) update_post_meta( $order_id, '_carrier_name', sanitize_text_field( $_POST['carrier_name'] ) ); if( isset( $_POST['carrier_number'] )) update_post_meta( $order_id, '_carrier_number', sanitize_text_field( $_POST['carrier_number'] ) ); }

Ce code se trouve dans le fichier function.php de votre thème enfant actif (ou thème). Testé et fonctionne.

Pas affichée:

entrez la description de l'image ici

Affiché lorsque “Interception locale” est sélectionné:

entrez la description de l'image ici