Remarque : Le code personnalisĂ© doit ĂȘtre copiĂ© dans le fichier fonction.php de votre thĂšme enfant.
Comment les champs de paiement sont-ils chargés dans WooCommerce ?
Les champs de facturation et d’expĂ©dition pour le paiement proviennent de la classe de pays (class-wc-countries.php
) et de laget_address_fields
fonction. Cela permet Ă WooCommerce d’activer/dĂ©sactiver les champs en fonction de l’emplacement de l’utilisateur.
Avant de renvoyer ces champs, WooCommerce les soumet Ă un filtre. Cela leur permet d’ĂȘtre modifiĂ© par des plugins tiers, des thĂšmes et votre propre code personnalisĂ©.
Facturation :
$address_fields = apply_filters('woocommerce_billing_fields', $address_fields);
Expédition:
$address_fields = apply_filters('woocommerce_shipping_fields', $address_fields);
La classe checkout ajoute les champs chargĂ©s Ă son tableau ‘checkout_fields’, ainsi que quelques autres champs comme « notes de commande ».
$this->checkout_fields['billing'] = $woocommerce->countries->get_address_fields( $this->get_value('billing_country'), 'billing_' );
$this->checkout_fields['shipping'] = $woocommerce->countries->get_address_fields( $this->get_value('shipping_country'), 'shipping_' );
$this->checkout_fields['compte'] = tableau(
'nom_utilisateur' du compte' => tableau (
'type' => 'texte',
'label' => __('Nom d'utilisateur du compte', 'woocommerce'),
'placeholder' => _x('Nom d'utilisateur', 'placeholder', 'woocommerce')
),
'account_password' => tableau(
'type' => 'mot de passe',
'label' => __('Mot de passe du compte', 'woocommerce'),
'placeholder' => _x('Mot de passe', 'placeholder', 'woocommerce'),
'classe' => tableau('formulaire-ligne-premier')
),
'account_password-2' => tableau (
'type' => 'mot de passe',
'label' => __('Mot de passe du compte', 'woocommerce'),
'placeholder' => _x('Mot de passe', 'placeholder', 'woocommerce'),
'class' => tableau('form-row-last'),
'label_class' => array('caché')
)
);
$this->checkout_fields['order'] = tableau(
'order_comments' => tableau (
'type' => 'zone de texte',
'classe' => tableau('notes'),
'label' => __('Notes de commande', 'woocommerce'),
'placeholder' => _x('Notes concernant votre commande, par exemple des notes spéciales pour la livraison.', 'placeholder', 'woocommerce')
)
);
Ce tableau passe Ă©galement par un filtre :
$this->checkout_fields = apply_filters('woocommerce_checkout_fields', $this->checkout_fields);
Cela signifie que vous avez un contrÎle total sur les champs de paiement : il vous suffit de savoir comment y accéder.
Remplacement des champs principaux
Le fait de vous connecter au filtre vous permet de remplacer n’importe quel champ. Ă titre d’exemple, modifions l’espace rĂ©servĂ© dans les champs order_comments. Actuellement, il est dĂ©fini sur :
woocommerce_checkout_fields_x('Notes concernant votre commande, par exemple des notes spéciales pour la livraison.', 'placeholder', 'woocommerce')
Nous pouvons changer cela en ajoutant une fonction Ă notre fichier themefunctions.php :
// Accrochez-vous
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
// Notre fonction accrochée - $fields est passée via le filtre !
fonction custom_override_checkout_fields( $fields ) {
$fields['order']['order_comments']['placeholder'] = 'Mon nouvel espace réservé';
retourner $champs ;
}
Vous pouvez remplacer d’autres Ă©lĂ©ments, tels que les Ă©tiquettes :
// Accrochez-vous
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
// Notre fonction accrochée - $fields est passée via le filtre !
fonction custom_override_checkout_fields( $fields ) {
$fields['order']['order_comments']['placeholder'] = 'Mon nouvel espace réservé';
$fields['order']['order_comments']['label'] = 'Ma nouvelle Ă©tiquette';
retourner $champs ;
}
Ou supprimez des champs :
// Accrochez-vous
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
// Notre fonction accrochée - $fields est passée via le filtre !
fonction custom_override_checkout_fields( $fields ) {
unset($fields['order']['order_comments']);
retourner $champs ;
}
Voici une liste complĂšte des champs du tableau transmis Ă woocommerce_checkout_fields
:
- Facturation
billing_first_name
billing_last_name
billing_company
billing_address_1
billing_address_2
billing_city
billing_postcode
billing_country
billing_state
billing_email
billing_phone
- Expédition
shipping_first_name
shipping_last_name
shipping_company
shipping_address_1
shipping_address_2
shipping_city
shipping_postcode
shipping_country
shipping_state
- Compte
account_username
account_password
account_password-2
- Commande
order_comments
Chaque champ contient un tableau de propriétés :
type
â type de champ (texte, zone de texte, mot de passe, sĂ©lection)label
â Ă©tiquette pour le champ de saisieplaceholder
â espace rĂ©servĂ© pour l’entrĂ©eclass
â classe pour lâentrĂ©erequired
â vrai ou faux, que le champ soit obligatoire ou nonclear
â vrai ou faux, applique un correctif clair au champ/Ă©tiquettelabel_class
â classe pour lâĂ©lĂ©ment labeloptions
â pour les cases de sĂ©lection, tableau dâoptions (clĂ© => paires valeur)
Dans des cas spécifiques, vous devez utiliser le woocommerce_default_address_fields
filtre. Ce filtre est appliquĂ© Ă tous les champs par dĂ©faut de facturation et d’expĂ©dition :
country
first_name
last_name
company
address_1
address_2
city
state
postcode
Par exemple, pour rendre le address_1
champ facultatif :
// Accrochez-vous
add_filter( 'woocommerce_default_address_fields' , 'custom_override_default_address_fields' );
// Notre fonction accrochée - $address_fields est transmis via le filtre !
fonction custom_override_default_address_fields( $address_fields ) {
$address_fields['address_1']['required'] = false;
retourner $address_fields ;
}
Définir les options de sélection
Si vous ajoutez un champ de type « select », comme indiqué ci-dessus, vous définirez des paires clé/valeur. Par exemple:
$fields['billing']['votre_champ']['options'] = array(
'option_1' => 'Texte de l'option 1',
'option_2' => 'Texte de l'option 2'
);
Priorité
La prioritĂ© en ce qui concerne le code PHP permet d’Ă©tablir quand un morceau de code – appelĂ© fonction – s’exĂ©cute par rapport au chargement d’une page. Il est dĂ©fini Ă l’intĂ©rieur de chaque fonction et est utile lors du remplacement du code existant pour un affichage personnalisĂ©.
Le code avec un numĂ©ro plus Ă©levĂ© dĂ©fini comme prioritĂ© s’exĂ©cutera aprĂšs le code avec un numĂ©ro infĂ©rieur, ce qui signifie qu’un code avec une prioritĂ© de 20 s’exĂ©cutera aprĂšs le code avec une prioritĂ© de 10.
L’argument de prioritĂ© est dĂ©fini lors de la fonction add_action , aprĂšs avoir Ă©tabli Ă quel hook vous vous connectez et quel sera le nom de votre fonction personnalisĂ©e.
Dans l’exemple ci-dessous, le texte bleu est le nom du hook que nous modifions, le texte vert est le nom de notre fonction personnalisĂ©e et le rouge est la prioritĂ© que nous dĂ©finissons.
Exemples
Modifier l’URL de redirection du bouton Retour Ă la boutique
Dans cet exemple, le code est configuré pour rediriger le bouton « Retour à la boutique » trouvé dans le panier vers une catégorie qui répertorie les produits à vendre sur http://example.url/category/specials/.
/**
* Changes the redirect URL for the Return To Shop button in the cart.
*/
function wc_empty_cart_redirect_url() {
return 'http://example.url/category/specials/';
}
add_filter( 'woocommerce_return_to_shop_redirect', 'wc_empty_cart_redirect_url', 10 );
LĂ , nous pouvons voir que la prioritĂ© est dĂ©finie sur 10. Il s’agit de la valeur par dĂ©faut typique pour les fonctions et les scripts WooCommerce, donc cela peut ne pas ĂȘtre suffisant pour remplacer la fonctionnalitĂ© de ce bouton.
Au lieu de cela, nous pouvons modifier la prioritĂ© en n’importe quel nombre supĂ©rieur Ă 10. MĂȘme si 11 fonctionnerait, les meilleures pratiques nous dictent d’utiliser des incrĂ©ments de dix, donc 20, 30, etc.
/**
* Changes the redirect URL for the Return To Shop button in the cart.
*/
function wc_empty_cart_redirect_url() {
return 'http://example.com/category/specials/';
}
add_filter( 'woocommerce_return_to_shop_redirect', 'wc_empty_cart_redirect_url', 20 );
En prioritĂ©, nous pouvons avoir deux fonctions qui agissent sur le mĂȘme hook. Normalement, cela poserait divers problĂšmes, mais comme nous avons Ă©tabli que l’un a une prioritĂ© plus Ă©levĂ©e que l’autre, notre site ne chargera que la fonction appropriĂ©e et nous serons redirigĂ©s vers la page Promotions comme prĂ©vu avec le code ci-dessous.
/**
* Changes the redirect URL for the Return To Shop button in the cart.
* BECAUSE THIS FUNCTION HAS THE PRIORITY OF 20, IT WILL RUN AFTER THE FUNCTION BELOW (HIGHER NUMBERS RUN LATER)
*/
function wc_empty_cart_redirect_url() {
return 'http://example.com/category/specials/';
}
add_filter( 'woocommerce_return_to_shop_redirect', 'wc_empty_cart_redirect_url', 20 );
/**
* Changes the redirect URL for the Return To Shop button in the cart.
* EVEN THOUGH THIS FUNCTION WOULD NORMALLY RUN LATER BECAUSE IT'S CODED AFTERWARDS, THE 10 PRIORITY IS LOWER THAN 20 ABOVE
*/
function wc_empty_cart_redirect_url() {
return 'http://example.com/shop/';
}
add_filter( 'woocommerce_return_to_shop_redirect', 'wc_empty_cart_redirect_url', 10 );
Ajout de champs d’expĂ©dition et de facturation personnalisĂ©s
L’ajout de champs s’effectue de la mĂȘme maniĂšre que le remplacement de champs. Par exemple, ajoutons un nouveau champ aux champs d’expĂ©dition âshipping_phone
:
// Hook in
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
// Our hooked in function â $fields is passed via the filter!
function custom_override_checkout_fields( $fields ) {
$fields['shipping']['shipping_phone'] = array(
'label' => __('Phone', 'woocommerce'),
'placeholder' => _x('Phone', 'placeholder', 'woocommerce'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true
);
return $fields;
}
/**
* Display field value on the order edit page
*/
add_action( 'woocommerce_admin_order_data_after_shipping_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
function my_custom_checkout_field_display_admin_order_meta($order){
echo '<p><strong>'.__('Phone From Checkout Form').':</strong> ' . get_post_meta( $order->get_id(), '_shipping_phone', true ) . '</p>';
}
Que faisons-nous du nouveau domaine? Rien. Ătant donnĂ© que nous avons dĂ©fini le champ dans le tableau checkout_fields, le champ est automatiquement traitĂ© et enregistrĂ© dans la mĂ©ta du message de commande (dans ce cas, _shipping_phone). Si vous souhaitez ajouter des rĂšgles de validation, consultez la classe checkout oĂč vous pouvez utiliser des hooks supplĂ©mentaires.
Ajout d’un champ spĂ©cial personnalisĂ©
Ajouter un champ personnalisé est similaire. Ajoutons un nouveau champ à la caisse, aprÚs les notes de commande, en nous connectant à ce qui suit :
/**
* Add the field to the checkout
*/
add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
function my_custom_checkout_field( $checkout ) {
echo '<div id="my_custom_checkout_field"><h2>' . __('My Field') . '</h2>';
woocommerce_form_field( 'my_field_name', array(
'type' => 'text',
'class' => array('my-field-class form-row-wide'),
'label' => __('Fill in this field'),
'placeholder' => __('Enter something'),
), $checkout->get_value( 'my_field_name' ));
echo '</div>';
}
Cela nous donne :
Ensuite, nous devons valider le champ lorsque le formulaire de paiement est publié. Pour cet exemple, le champ est obligatoire et non facultatif :
/**
* Process the checkout
*/
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
// Check if set, if its not set add an error.
if ( ! $_POST['my_field_name'] )
wc_add_notice( __( 'Please enter something into this new shiny field.' ), 'error' );
}
Une erreur de paiement s’affiche si le champ est vide :
Enfin, sauvegardons le nouveau champ pour trier les champs personnalisĂ©s Ă l’aide du code suivant :
/**
* Update the order meta with field value
*/
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );
function my_custom_checkout_field_update_order_meta( $order_id ) {
if ( ! empty( $_POST['my_field_name'] ) ) {
update_post_meta( $order_id, 'My Field', sanitize_text_field( $_POST['my_field_name'] ) );
}
}
Le champ est maintenant enregistré dans la commande.
Si vous souhaitez afficher la valeur du champ personnalisĂ© sur la page d’Ă©dition de la commande admin, vous pouvez ajouter ce code :
/**
* Display field value on the order edit page
*/
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
function my_custom_checkout_field_display_admin_order_meta($order){
echo '<p><strong>'.__('My Field').':</strong> ' . get_post_meta( $order->id, 'My Field', true ) . '</p>';
}
Voici le résultat :
Rendre le numéro de téléphone non obligatoire
add_filter( 'woocommerce_billing_fields', 'wc_npr_filter_phone', 10, 1 );
function wc_npr_filter_phone( $address_fields ) {
$address_fields['billing_phone']['required'] = false;
return $address_fields;
}
Source : https://woo.com/document/tutorial-customising-checkout-fields-using-actions-and-filters/