Cheatsheet

Ajouter des champs aux produits

Laisser un commentaire

Comme pour les pages et les posts, il est possible d’ajouter des champs aux produits. Cela permet de mettre en avant des informations que vous ne souhaitez pas mettre dans la description : délai de livraison…

Par ailleurs, le fait de pouvoir isolser cette information dans le modèle de données permet également d’effectuer des opérations comme filtrer les produits d’après cette information.

Ajouter un champ général

Pour ajouter un champ global, le plus simple reste d’utiliser un plugin de champs personnalisés, tel qu’ACF. Cependant, rien ne vous oblige à utiliser un plugin.

Champs personnalisés fiche produit
J'utilise ici les champs personalisés pour ajouter un slogan et la garantie
// Ajout des champs "sous-titre" & garantie
add_action('woocommerce_product_options_general_product_data', function () {
    woocommerce_wp_text_input([
        'id' => '_subtitle',
        'label' => 'Sous-titre',
        'placeholder' => 'Phrase d’accroche…'
    ]);

    woocommerce_wp_text_input([
        'id' => '_guarantee',
        'label' => 'Garantie pour',
        'placeholder' => '10 ans, à vie…'
    ]);
});

// Enregistrement des données des champs à la sauvegarde
add_action('woocommerce_process_product_meta', function ($post_id) {
    $subtitle = !empty($_POST['_subtitle']) ? $_POST['_subtitle'] : null;
    $guarantee = !empty($_POST['_guarantee']) ? $_POST['_guarantee'] : null;

    update_post_meta($post_id, '_subtitle', esc_attr($subtitle));
    update_post_meta($post_id, '_guarantee', esc_attr($guarantee));
});

Dans vos templates en front, vous récupérez la donnée en tant que post_meta (vous feriez la même chose avec ACF).

$subtitle = get_post_meta($product->get_id(), '_subtitle', true);

Ajouter des champs aux variations produits

ACF ne pourra ici pas vous aider car il ne permet pas d’ajouter de nouveaux champs aux variations. Si vos besoins sont complexes, je vous recommande WooCommerce Custom Fields Variations. Ce plugin offre tous les types de champs (textarea, select, checkbox…), permet d’en ajouter autant que vous le souhaitez et de les grouper par thème.

Vous pouvez également coder le tout via le functions.php. C’est ce que je fais en général si je n’ai que de simples besoins.

// Ajout du champ pour chaque variation
add_action('woocommerce_variation_options_pricing', function ($loop, $variation_data, $variation) {
    woocommerce_wp_text_input([
        'id' => 'delivery_time[' . $loop . ']',
        'wrapper_class' => 'form-row',
        'label' => 'Livraison',
        'value' => get_post_meta($variation->ID, 'delivery_time', true)
    ]);
}, 10, 3);

// Sauvegarde des info lors de la sauvegarde des variations
add_action('woocommerce_save_product_variation', function ($variation_id, $i) {
    $delivery_time = $_POST['delivery_time'][$i];

    if (isset($delivery_time)) update_post_meta($variation_id, 'delivery_time', esc_attr($delivery_time));
}, 10, 2);

// Récupération de la donnée pour affichage du back
add_filter('woocommerce_available_variation', function ($variations) {
    $variations['delivery_time'] = get_post_meta($variations['variation_id'], 'delivery_time', true);
    return $variations;
});

Par la suite, vous récupérez vos nouvelles variations comme n’importe quelle propriété des variations.

foreach ($product->get_available_variations() as $variation) {
    $delivery = $variation['delivery_time'];
}

Commentaires

Mathis dit –

Bonjour j'aimerais savoir dans quel fichier ajouter ce code pour ajouter des champs personnalisez dans un champ général ?

Buzut dit –

Il faut placer le code dans le functions.php du thème.

Louis dit –

Bonjour, si on ajoute des champs personnalisés, comme ça se passe pour importer en masse des produits ?

Buzut dit –

Ça doit dépendre du plugin utilisé. Si c'est la méthode native de WooCommerce je ne suis plus certain que ça fonctionne, il faudrait tester.

Rejoignez la discussion !

Vous pouvez utiliser Markdown pour les liens [ancre de lien](url), la mise en *italique* et en **gras**. Enfin pour le code, vous pouvez utiliser la syntaxe `inline` et la syntaxe bloc

```
ceci est un bloc
de code
```