web-dev-qa-db-fra.com

WooCommerce - Comment ajouter un champ personnalisé au panier et aux totaux du panier

J'utilise le plugin WooCommerce et j'ai la requête suivante:

Dans la page de produit unique, j'ai un produit pour lequel, en fonction de certaines sélections effectuées par l'acheteur, une valeur de coût d'expédition est calculée, que je dois ensuite transmettre/inclure dans le cadre des articles du panier dans une nouvelle colonne, "Frais d'expédition" lorsque regarder votre panier.

Le problème est cependant que l’acheteur peut décider d’acheter trois produits différents pour lesquels chacun de ces trois produits peut comporter des calculs de coûts d’expédition différents, après avoir appuyé trois fois sur le bouton "Ajouter au panier".

Par exemple:

Product A selections calculates a Shipping Cost of $2.00
Product B selections calculates a Shipping Cost of $4.00
Product C selections calculates a Shipping Cost of $6.00

Donc, sur la base de ce qui précède, lorsque l’acheteur a terminé ses achats et appuie sur "Afficher le panier", je souhaite qu’ils voient:

Item                       Price      Shipping Cost      Quantity          Total     
---------------------------------------------------------------------------------------
Product A                      $10        $2                     1                 $10
Product B                      $5         $4                     1                 $5
Product C                      $15        $6                     1                 $15

C'est la colonne de champ personnalisée "Coût d'expédition" que j'aimerais ajouter au panier. C'est ce que je ne sais pas comment faire.

En plus de ce qui précède, je souhaite également ajouter aux "Totaux du panier" ci-dessous, un autre champ personnalisé de "Frais d’expédition" qui s’élèverait à 12 USD, montant qui serait ensuite ajouté au produit total, c.-à-d.

Cart Totals

Cart Subtotal       $30
Shipping Cost       $12

Order Total         $42

Une partie du code que j'ai utilisé pour le panier Le coût total d'expédition est:

function woo_add_cart_fee() {
  global $woocommerce;
  $woocommerce->cart->add_fee( __('Shipping Cost', 'woocommerce'), 100 );
}
add_action( 'woocommerce_before_calculate_totals', 'woo_add_cart_fee');

J'ai donc besoin de savoir comment ajouter le "coût d'expédition" aux détails du produit du panier ainsi qu'aux totaux du panier.

Toute aide au codage serait très appréciée.

Merci.

7
tonyf

Commencez par stocker le champ personnalisé lorsque vous modifiez votre produit. Disons que vous utilisez le champ personnalisé custom_shipping_cost. Assurez-vous qu'il est stocké sous la forme d'un nombre, 20 par exemple, PAS 20,00 $

Ensuite, vous devez afficher ce champ sur la page du panier. Malheureusement, aucun filtre n’a été ajouté pour ajouter une nouvelle colonne dans la table des paniers. Vous devez donc modifier le fichier de modèle. Sinon, ce code ajoutera la valeur supplémentaire au dernier. colonne:

add_filter('woocommerce_cart_item_subtotal','additional_shipping_cost',10,3);
function additional_shipping_cost($subtotal, $values, $cart_item_key) {
    //Get the custom field value
    $custom_shipping_cost = get_post_meta($post->ID, 'custom_shipping_cost', true);

    //Just for testing, you can remove this line
    $custom_shipping_cost = 10;

    //Check if we have a custom shipping cost, if so, display it below the item price
    if ($custom_shipping_cost) {
        return $subtotal.'<br>+'.woocommerce_price($custom_shipping_cost).' Shipping Cost';
    } else {
        return $subtotal;   
    }
}

Donc, avec cela, la première partie de la question est faite. Si vous souhaitez l'afficher comme dans l'exemple ci-dessus, vous devez dupliquer le fichier plugins/woocommerce/templates/cart/cart.php dans themes/yourtheme/woocommerce/cart/cart.php. Puis éditez le fichier, ajoutez votre propre colonne, vous pouvez utiliser le code ci-dessus pour afficher le prix.

Après cela, nous devons mettre à jour les totaux du panier avec les coûts supplémentaires. Votre code avec add_fee est très pratique:

function woo_add_cart_fee() {
    global $woocommerce;

    $extra_shipping_cost = 0;
    //Loop through the cart to find out the extra costs
    foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
        //Get the product info
        $_product = $values['data'];

        //Get the custom field value
        $custom_shipping_cost = get_post_meta($_product->id, 'custom_shipping_cost', true);

        //Just for testing, you can remove this line
        $custom_shipping_cost = 10;

        //Adding together the extra costs
        $extra_shipping_cost = $extra_shipping_cost + $custom_shipping_cost;
    }

    //Lets check if we actually have a fee, then add it
    if ($extra_shipping_cost) {
        $woocommerce->cart->add_fee( __('Shipping Cost', 'woocommerce'), $extra_shipping_cost );
    }
}
add_action( 'woocommerce_before_calculate_totals', 'woo_add_cart_fee');

C'est ça, ça devrait marcher après ça. Assurez-vous de supprimer les lignes Juste pour tester ... des deux codes, je n'ai pas créé le champ personnalisé sur mon site pour le test.

4
passatgt