Prestashop : Franco de port pour une seule zone ou un seul transporteur

Chez Magavenue, nous avons régulièrement les mêmes questions par e-mail. C’est pourquoi nous allons reprendre certaines questions sur le blog, afin d’apporter une explication plus claire.

Une de ces questions est la suivante :

« Comment faire sur Prestashop, pour n’appliquer la gratuité des frais de port qu’à un seul pays ? ou qu’à un seul transporteur ? « 

En effet la question est perspicace, si jamais un commerçant décide d’utiliser le calcul des frais de ports par le poids et non par le prix, il n’est alors pas possible de dissocier les zones, ou les transporteurs, pour offrir les frais de port.
On se retrouve alors confronter à un problème :

-soit nous utilisons un calcul des frais de port par le prix. Mais vous pourrez avoir le problème d’un objet lourd pas très cher, ou d’un objet très cher, pas très lourd. Il ne reste plus qu’à espérer que la moyenne des deux… bref, ce n’est pas forcément la solution idéal pour tous.

-soit vous offrez les frais de port à 50€, mais vous devrez les offrir quelques soit la zone où se trouve le client, ou le transporteur utilisé.

Bref, une solution simple existe. Malheureusement elle consiste à modifier l’une des classe de Prestashop. En général nous pouvons contourner par un module, mais ici, ce serait trop compliqué. C’est pourquoi nous vous déconseillons de la mettre en place.

Si vous choisissez de la réaliser, pensez avant toute modification, à réaliser une sauvegarde complète de votre boutique, et surtout garder un historique des fichiers que vous avez modifié pour une éventuelle mise à jour.

Nous parlons pour Prestashop 1.3.1, la modification peut s’appliquer aux anciennes versions, il faudra juste faire attention à l’endroit où vous aller placer le code.

Dans le fichier Cart.php contenu dans le dossier Classes. Vous aurez aux alentours de la ligne 833 le code suivant :

if ($orderTotalwithDiscounts >= floatval($free_fees_price) AND floatval($free_fees_price) > 0)
return $shipping_cost;

En clair, si le montant total de la commande (avec les bons de réductions compris) est supérieur au montant du franco de port, alors nous offrons les frais de port (à ce moment là $shipping_cost = 0).

Nous allons simplement modifier cette ligne, de la manière suivante :

if ($orderTotalwithDiscounts >= floatval($free_fees_price) AND floatval($free_fees_price) > 0 AND intval($id_zone) == 6)
return $shipping_cost;

Ici nous demandons à ce que le frais de port soit offert uniquement si la zone de livraison est égale à 6 (dans notre exemple nous avons créé une zone spécifique dont l’identifiant est 6.

Vous pouvez aussi limité à un seul transporteur de la manière suivante :

if ($orderTotalwithDiscounts >= floatval($free_fees_price) AND floatval($free_fees_price) > 0 AND intval($id_carrier) == 2)
return $shipping_cost;

Bien sûr il serait possible de faire un module pour paramétrer directement depuis le Back Office, à quel transporteur ou à quelle zone nous souhaitons offrir les frais de port. A suivre…

20 commentaires sur “Prestashop : Franco de port pour une seule zone ou un seul transporteur”

  1. Mathix,

    Nous avons proposé une solution simple pour qu’un utilisateur lambda puisse la mettre en ligne.

    Si un prestataire devait faire cette manipulation, alors oui, il devrait utiliser une configuration ou une recherche plutôt que l’id en brut.

  2. salut à tous,

    le problème (ce n’est pas la méthode mais plutôt prestashop le problème… une fois de plus), est que lorsque l’on édite un transporteur alors son id_carrier change.
    Ce n’est donc pas une solution fiable si celui qui administre le site n’est pas le webmaster car cela risque d’annuler toute gratuité de transport si l’administrateur veux par exemple changer le logo du transporteur ou autre.

    A moins que je me trompe…

  3. Bonjour,

    Merci pour le tuto, mais j’ai essayé sous la version 1.4.7.3 mais ma page ne fonctionne plus côté FO, je voulais savoir s’il fallait la même commande ou non ?

    Merci par avance pour votre aide.

    Cordialement

  4. Bonjour,
    Merci pour cet article et votre boulot, mais je ne souhaite pas touché le code de mon site pour le faire évoluer plus facilement sur les nouvelles versions.
    Vous dites :
    «  »Bien sûr il serait possible de faire un module pour paramétrer directement depuis le Back Office, à quel transporteur ou à quelle zone nous souhaitons offrir les frais de port. A suivre…
    Pensez vous faire ce module en fonction du poids/zone un jour, je serais fortement intéressé et je n’ai rien trouvé de tel..
    Merci. Alain

  5. Pour moi, j’ai réussi a faire les frais de port gratuit pour la france uniquement, maintenant, j’aimerai rajouter au script la fonction : frais de port 50% pour d’autre pays avec un autre prix en référence:
    actuellement : 100€ achat = port offert en france
    je voudrais ajouter : 150€ achat = 50% frais de port offeert

  6. Bonjour, cette modif fonctionne bien pour une zone, mais est il possible de l’appliquer pour 2 zone? (exemple zone 6 et zone 7)
    D’avance merci

  7. bonjour
    j ai reussi a faire comme ce bon tuto , mais le probleme c est que ce n est pas le frais de port qui est gratuit mais aussi la manutention ,
    ??comment faire alors ..???

  8. Bjr,
    La modif fonctionne tres bien pour une zone et un transporteur mais je n’arrive pas avec une zone et deux transporteur , avez vous une piste de code??
    merci, bonne soirée

  9. Oui il faut que dans la ligne de code que je vous ai fournis, vous remplaciez le chiffre 6 par la zone, dans laquelle il n’y a que la France.

  10. Suite au changement de la ligne de code dans le fichiers cart.php ,le changement se fait bien ,mais aussi sur le pays France il me remet les frais de port au dessus d’un achat > 50€.
    peut un problème de Zone???
    merci de votre aide

  11. Notre tutoriel a été fait pour Prestashop 1.3, votre boutique semble tourner sous Prestashop 1.2.5. D’où le fait que vous ne trouviez pas la bonne ligne.

    A vue de nez, il faut modifier la ligne :
    if (isset($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND $orderTotal >= floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) > 0)
    return $shipping_cost;

    en
    if (isset($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND $orderTotal >= floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) > 0 AND intval($id_zone) == 6)
    return $shipping_cost;

  12. Bonjour
    je suis dans le cas que vous indiquez ci-dessus avec des frais de port gratuit pour la zone France au dessus de 50 €,ayant paramétrer d’autres pays je voudrais que la gratuité s’applique à un pays « France »
    Je voulais donc modifier le fichier cart.php mais je trouve pas la ligne à modifier voici une copie des lignes du fichier
    $configuration = Configuration::getMultiple(array(‘PS_SHIPPING_FREE_PRICE’, ‘PS_SHIPPING_HANDLING’, ‘PS_SHIPPING_METHOD’, ‘PS_SHIPPING_FREE_WEIGHT’));
    // Free fees
    if (isset($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND $orderTotal >= floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) > 0)
    return $shipping_cost;
    if (isset($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND $this->getTotalWeight() >= floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) > 0)
    return $shipping_cost;
    $configuration = Configuration::getMultiple(array(‘PS_SHIPPING_FREE_PRICE’, ‘PS_SHIPPING_HANDLING’, ‘PS_SHIPPING_METHOD’, ‘PS_SHIPPING_FREE_WEIGHT’));
    // Free fees
    if (isset($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND $orderTotal >= floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) AND floatval($configuration[‘PS_SHIPPING_FREE_PRICE’]) > 0)
    return $shipping_cost;
    if (isset($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND $this->getTotalWeight() >= floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) AND floatval($configuration[‘PS_SHIPPING_FREE_WEIGHT’]) > 0)
    return $shipping_cost;
    merci de votre aide

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *