Publié le

Ajouter le Siret / un champ sur la facturation de Woocommerce

Il est possible d’ajouter un champ personnalisé dans le tunnel de conversion de woocommerce afin de demander d’autres informations à vos clients, tel que le Siret par exemple.

Dans cet exemple, nous afficherons le Siret dans le tunnel de conversion, puis nous l’enregistrerons en base et nous l’afficherons dans la commande de l’admin et dans la facture en pdf en utilisant le plugin PDF Invoice & Packing Slips for WooCommerce.

Afin d’ajouter ce nouveau champ, il vous faudra éditer le fichier functions.php de votre thème.

Comme l’indique la FAQ de Woocommerce, https://woo.com/document/tutorial-customising-checkout-fields-using-actions-and-filters/ , pour insérer un champ dans le tunnel de conversion, il faut ajouter une action en ciblant le hook désiré.

Ici, nous insérerons le champ après le bloc notes/commentaires

add_action( 'woocommerce_after_order_notes', 'siret_checkout_field' );

Puis nous créons la fonction qui affichera le champ dans le tunnel :

function siret_checkout_field( $checkout ) {

    echo '' . __("Informations Société") . '';

    woocommerce_form_field( 'my_field_siret', array(
        'type' => 'text',
        'class' => array('siret-class form-row-wide'),
        'label' => __('N° de Siret'),
        'required' => true,
        'placeholder' => __('(siret)'),
        ), 
    $checkout->get_value( 'my_field_siret' ));

}

Ensuite, nous devons valider le champ étant donné que nous l’avons mis en obligatoire ‘required’ => true

add_action('woocommerce_checkout_process', 'siret_checkout_field_process');

function siret_checkout_field_process() {
// Check if set, if its not set add an error.
    if ( ! $_POST['my_field_siret'] )
    wc_add_notice( __( 'Merci de compléter ces champs' ), 'error' );
}

Une fois la commande passer, il faut sauvegarder les informations de ce champ en base. Pour ce faire, il faut mettre à jour la meta

add_action( 'woocommerce_checkout_update_order_meta', 'siret_checkout_field_update_order_meta' );

function siret_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['my_field_siret'] ) ) {
    update_post_meta( $order_id, 'N° de Siret', sanitize_text_field( $_POST['my_field_siret'] ) );
    }
}

Pour aficher ce nouveau champ dans la commande de l’administration, il suffira d’ajouter une action en utilisant le hook désiré, par exemple woocommerce _admin _order _data _after _billing _address, qui affichera le champ en dessous des informations de l’adresse de facturation

add_action( 'woocommerce_admin_order_data_after_billing_address', 'siret_checkout_field_display_admin_order_meta', 10, 1 );

    function siret_checkout_field_display_admin_order_meta($order){
    echo ''.__('N° de Siret').': ' . get_post_meta( $order->id, 'N° de Siret', true ) .'
    ';
}

Maintenant que nous avons bien les informations sur le front et dans le back, nous pouvons l’afficher dans la facture PDF grâce au module PDF Invoice & Packing Slips for WooCommerce.

Pour commencer, installer le module. Ce module vous permettra d’avoir vos factures au format PDF en front et en back.

Attention ce plugin nécessite l’accès au fichier /wp-admin/admin-ajax.php, donc si vous avez protégé votre répertoire admin avec un mot de passe, n’oubliez d’ajouter une règle à votre htaccess de type :

# Allow access to admin-ajax.php without authentication
SetEnvIf Request_URI "^/wp-admin/admin-ajax\.php$" allow_ajax
Order allow,deny
Allow from env=allow_ajax
Satisfy any

Comme l’indique la FAQ du plugin, vous pouvez ajouter des actions via des hook :

Displaying a custom field

La liste complète des hook se trouve en bas de page : PDF template action hooks 

Dans notre exemple, nous afficherons notre champ après l’adresse de facturation via ce hook wpo_ wcpdf_ after_ billing_ address

add_action( 'wpo_wcpdf_after_billing_address', 'wpo_wcpdf_siret_checkout_field', 10, 2 );
function wpo_wcpdf_siret_checkout_field ($template_type, $order) {
    if ($template_type == 'invoice') {
        $document = wcpdf_get_document( $template_type, $order );
        ?>      
        <tr class="siret">
            <td>Siret : <?php echo get_post_meta( $order->id, 'N° de Siret', true ); ?> </td>
        </tr>
        <?php
    }
}

Noter qu’ici on cible la template pdf ‘invoice’ mais vous pouvez aussi cibler la template bon de commande $template_type == ‘packing-slip’

Voici le code complet à ajouter à votre fichier functions.php de votre thème.

Pour ajouter un nouveau champ, il vous suffira de changer le nom de la fonction siret_checkout_field et le nom du champ/meta my_field_siret en faisant un chercher/remplacer.

/**-- SIRET --**/
/**
* Add the field to the checkout
*/
add_action( 'woocommerce_after_order_notes', 'siret_checkout_field' );

function siret_checkout_field( $checkout ) {

    echo '' . __("Informations Société") . '';

    woocommerce_form_field( 'my_field_siret', array(
        'type' => 'text',
        'class' => array('siret-class form-row-wide'),
        'label' => __('N° de Siret'),
        'required' => true,
        'placeholder' => __('(siret)'),
        ), 
    $checkout->get_value( 'my_field_siret' ));
}

/**
* Process the checkout
*/
add_action('woocommerce_checkout_process', 'siret_checkout_field_process');

function siret_checkout_field_process() {
// Check if set, if its not set add an error.
    if ( ! $_POST['my_field_siret'] )
    wc_add_notice( __( 'Merci de compléter ces champs' ), 'error' );
}

/**
* Update the order meta with field value
*/
add_action( 'woocommerce_checkout_update_order_meta', 'siret_checkout_field_update_order_meta' );

function siret_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['my_field_siret'] ) ) {
    update_post_meta( $order_id, 'N° de Siret', sanitize_text_field( $_POST['my_field_siret'] ) );
    }
}

/**
* Display field value on the order edit page
*/
add_action( 'woocommerce_admin_order_data_after_billing_address', 'siret_checkout_field_display_admin_order_meta', 10, 1 );

    function siret_checkout_field_display_admin_order_meta($order){
    echo ''.__('N° de Siret').': ' . get_post_meta( $order->id, 'N° de Siret', true ) .'
    ';
}

/**
* Display field value on the pdf invoice
*/
add_action( 'wpo_wcpdf_after_billing_address', 'wpo_wcpdf_siret_checkout_field', 10, 2 );
function wpo_wcpdf_siret_checkout_field ($template_type, $order) {
    if ($template_type == 'invoice') {
        $document = wcpdf_get_document( $template_type, $order );
        ?>      
        <tr class="siret">
            <td>Siret : <?php echo get_post_meta( $order->id, 'N° de Siret', true ); ?> </td>
            
        </tr>
        <?php
    }
}
/**-- EOF SIRET --**/
Publié le Laisser un commentaire

Woocommerce: Changer le texte du bouton ‘Ajouter au panier’ des produits apparentés.

Dans cet article nous allons voir comment changer le texte du bouton « ajouter au panier » des produits apparentés.

Pour commencer, il faut créer une fonction qui utilisera un hook, ce qui permettra d’injecter votre texte à la place de celui mis en place par Woocommerce.

Dans votre fichier functions.php, créez votre fonction puis grâce aux hooks, ajoutez la via la fonction add_filter.

Ce changement se fera sur tout les produits apparentés. Il suffira de remplacer ‘Votre nouveau texte’ pour faire la modification sur ce  bouton.

add_filter( 'woocommerce_product_add_to_cart_text', 'eloou_cart_button_text' );

function eloou_cart_button_text() {
    return 'Votre nouveau texte';
}

Changer le texte pour un produit spécifique

Il est aussi possible de changer le texte selon le produit, si l’utilisateur est en ligne ou si l’utilisateur a un certain rôle.

Tout est possible.

Je vais vous donner un exemple pour afficher un texte différent si mon produit, qui a pour id ‘2494’, est affiché dans les produits apparentés.

Ligne 5 et 6

Je vais chercher l’ID du produit

Ligne 7

Puis je déclare l’ID du produit qui m’intéresse.

Ligne 9

Je retourne le nouveau texte à condition que l’ID de mon produit soit égal à celui du produit qu’on observe, sinon il retournera un texte par défaut.

    add_filter( 'woocommerce_product_add_to_cart_text', 'eloou_cart_button_text' );
    
    function eloou_cart_button_text() {

        global $product;
        $product_id = $product->id;
        $productId = 2494;

        return ($product_id == $productId ? 'Votre nouveau texte' : 'Un texte par défaut.');
        
    }

Pour allez plus loin

Vous vous demandez peu être s’il est possible d’ajouter une interface dans l’admin pour modifier votre texte sans devoir s’aventurer dans le code?

Et bien oui!
Mais nous verrons ça dans un prochain article.

Maintenant c’est à vous de jouer!

Publié le Laisser un commentaire

Woocommerce: Changer le prix d’un produit en fonction d’un client

woocommerce-user-meta-date-price-change
woocommerce-user-meta-date-price-change

Dans cet article nous allons voir comment changer le prix d’un produit en fonction d’un champs personnalisé, aussi appelés user meta data.

Pour commencer, il faut créer une fonction impactant le prix de l’article

Dans votre fichier functions.php, créez votre fonction puis grâce aux hooks, ajoutez la via la fonction add_filter.

    // Un changement de prix gobal
    function eloou_price( $price, $product ) {
     return $price;
    }
    
    add_filter( 'woocommerce_product_get_price', 'eloou_price', 10, 2 );
    add_filter( 'woocommerce_product_get_regular_price', 'eloou_price', 10, 2 );
    add_filter( 'woocommerce_product_get_sale_price', 'eloou_price', 10, 2 );

Il faut d’abord vérifier que l’utilisateur soit connecté, puis récupérer le champs personnalisé à cibler

if ( is_user_logged_in() ) {
    $user = wp_get_current_user(); 
    $meta = get_the_author_meta( 'votre_custom_meta', $user->ID );
}

Changer le prix de tous les produits

On peut maintenant changer le prix grâce à une formule mathématique, en créant une nouvelle variable $newPrice.

Ligne 7
Le prix changera uniquement si le meta de l’utilisateur existent.

function eloou_price( $price, $product ) {
    if ( is_user_logged_in() ) {
        $user = wp_get_current_user();
        $meta = get_the_author_meta( 'votre_custom_meta', $user->ID );
        $newPrice = 0.50;
        // on vérifie que le meta existe
        if ( $meta ) {
            $price = $price * $newPrice;
        }
    }
    return $price;
}

Changer le prix d'un seul produit

Pour viser un produit en particulier, il n’ y a rien de plus simple!

Chaque produit possède un ID. qui se trouve dans l’url du produit de votre administration :
/wp-admin/post.php?post=2494&action=edit&classic-editor

Pour mon exemple, je choisis le produit ayant l’id = 2494.

Ligne 7
Je vais chercher l’ID du produit en me servant d’une fonction Woocommerce.
Ligne 6
Puis je déclare l’ID du produit qui m’intéresse.
Ligne 9

Je rajoute à ma condition: Si le méta existe, et si c’est le produit avec l’ID 2494, alors  on change le prix.

function eloou_price( $price, $product ) {
    if ( is_user_logged_in() ) {
        $user = wp_get_current_user();
        $meta = get_the_author_meta( 'votre_custom_meta', $user->ID ); 
        $newPrice = 0.50; // votre réduction
        $product_id = 2494; // l'ID de votre produit
        $productId = $product->get_id();

        if ( $meta && $product_id == $productId ) {
            $price = $price * $newPrice;
        }
    }
    return $price;
}

Pour allez plus loin

Vous vous demandez peu être s’il est possible d’ajouter une interface dans l’admin pour modifier les produits,  les calculs et peut être même les métas datas ? 
Et bien oui!
Mais nous verrons ça dans un prochain article.

Maintenant c’est à vous de jouer!