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:
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:
Affiché lorsque “Interception locale” est sélectionné: