WooCommerce : désactivation des champs de paiement avec un hook de filtre

Vous devez utiliser la unset()fonction √† cet effet et vous pouvez le faire de cette fa√ßon :

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );

function custom_override_checkout_fields( $fields ) {
    unset($fields['billing']['billing_address_1']);
    unset($fields['billing']['billing_address_2']);
    unset($fields['billing']['billing_postcode']);
    unset($fields['billing']['billing_city']);
    unset($fields['billing']['billing_phone']);
    return $fields;
}

Vous devrez coller ce code dans le fichier function.php situé dans votre thème ou thème enfant actif.


Vous avez modifi√© votre question avec une mise √† jour : Voici ma nouvelle r√©ponse

Rendre les champs d’adresse facultatifs (concernant votre mise √† jour) :

Vous devez utiliser un autre crochet de filtre √† cet effet. Il existe 2 crochets de filtre diff√©rents :

1) Pour les champs de facturation :

add_filter( 'woocommerce_billing_fields', 'wc_optional_billing_fields', 10, 1 );
function wc_optional_billing_fields( $address_fields ) {
    $address_fields['billing_address_1']['required'] = false;
    $address_fields['billing_address_2']['required'] = false;
    $address_fields['billing_postcode']['required'] = false;
    $address_fields['billing_city']['required'] = false;
    $address_fields['billing_phone']['required'] = false;
    return $address_fields;
}

2) Pour les champs d’exp√©dition :

add_filter( 'woocommerce_shipping_fields', 'wc_optional_shipping_fields', 10, 1 );
function wc_optional_shipping_fields( $address_fields ) {
    $address_fields['shipping_phone']['required'] = false;
    return $address_fields;
}

Pour rendre les champs d’adresse obligatoires :

Vous pouvez utiliser les m√™mes hooks et fonctions ci-dessus, en changeant pour chaque champ falseen true.


Vous devrez coller ce code dans le fichier function.php situé dans votre thème ou thème enfant actif.

R√©f√©rence : Personnalisation des champs de paiement √† l’aide de hooks

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

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/

Boucle d’√©chantillons de produits

<ul class="products">
	<?php
		$args = array(
			'post_type' => 'product',
			'posts_per_page' => 12
			);
		$loop = new WP_Query( $args );
		if ( $loop->have_posts() ) {
			while ( $loop->have_posts() ) : $loop->the_post();
				wc_get_template_part( 'content', 'product' );
			endwhile;
		} else {
			echo __( 'No products found' );
		}
		wp_reset_postdata();
	?>
</ul><!--/.products-->