Personnalisation des champs de paiement Ă  l’aide d’actions et de filtres

logo carre@4x

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 saisie
  • placeholder– espace rĂ©servĂ© pour l’entrĂ©e
  • class– classe pour l’entrĂ©e
  • required– vrai ou faux, que le champ soit obligatoire ou non
  • clear– vrai ou faux, applique un correctif clair au champ/Ă©tiquette
  • label_class– classe pour l’élĂ©ment label
  • options– pour les cases de sĂ©lection, tableau d’options (clĂ© => paires valeur)

Dans des cas spĂ©cifiques, vous devez utiliser le  woocommerce_default_address_fieldsfiltre. 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_1champ 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>';
}
C'est vivant!
C’est vivant!

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 :

WooCommerce Codex - Crochet de champ de paiement

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 :

WooCommerce Codex – Avis sur le champ de paiement

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 :

checkout_field_custom_field_admin

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/