You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prestashop中添加两个带不同数据/价格的‘加入购物车’按钮

嘿,我来帮你搞定这个需求!要在PrestaShop里加两个对应不同价格的「加入购物车」按钮,其实核心是让每个按钮携带专属的价格类型标识,然后在后台处理添加逻辑时,根据这个标识调用对应的价格计算。下面是针对PrestaShop 1.7+版本的具体步骤(旧版本思路一致,只是文件路径略有差异):

第一步:修改产品详情页模板,添加第二个按钮

首先找到你的主题产品详情页模板文件,路径一般是/themes/你的主题/templates/catalog/product/product.tpl(如果是自定义主题,路径可能类似)。

找到原有的「加入购物车」按钮代码,通常是被<form>标签包裹的。你可以复制一份原按钮的表单结构,然后修改按钮文字和新增价格类型标识:

<!-- 第一个按钮:以折扣价加入购物车 -->
<form action="{$urls.pages.cart}" method="post" id="add-to-cart-discount" class="add-to-cart-form">
  <input type="hidden" name="id_product" value="{$product.id_product}">
  <input type="hidden" name="id_product_attribute" value="{$product.id_product_attribute}">
  <input type="hidden" name="quantity" value="1">
  <input type="hidden" name="price_type" value="discount"> <!-- 折扣价标识 -->
  <button type="submit" class="btn btn-primary">以折扣价加入购物车</button>
</form>

<!-- 第二个按钮:以原价加入购物车 -->
<form action="{$urls.pages.cart}" method="post" id="add-to-cart-old" class="add-to-cart-form" style="margin-top: 10px;">
  <input type="hidden" name="id_product" value="{$product.id_product}">
  <input type="hidden" name="id_product_attribute" value="{$product.id_product_attribute}">
  <input type="hidden" name="quantity" value="1">
  <input type="hidden" name="price_type" value="old"> <!-- 原价标识 -->
  <button type="submit" class="btn btn-secondary">以原价加入购物车</button>
</form>

提示:如果原模板里已经有一个大的form包裹所有提交内容,也可以不用单独写两个form,而是在同一个form里放两个按钮,给每个按钮设置不同的name属性,不过分开form能避免提交冲突,逻辑更清晰。

第二步:修改购物车控制器,处理价格类型逻辑

接下来需要修改购物车的核心处理逻辑,找到控制器文件/controllers/front/CartController.php,定位到postProcess()方法——这是处理添加购物车请求的关键方法。

  1. 先获取前端提交的price_type参数:
$priceType = Tools::getValue('price_type');
  1. 找到获取产品价格的代码段(原代码类似$productPrice = $product->getPrice(false, null, 6);),替换成根据价格类型判断的逻辑:
// 初始化产品价格为默认折扣价
$productPrice = $product->getPrice(false, null, 6);

// 如果选择原价,且产品设置了原价,则替换为原价
if ($priceType === 'old' && !empty($product->old_price) && $product->old_price > 0) {
    $productPrice = $product->old_price;
}

如果你的PrestaShop版本里$product->old_price无法直接获取,可以通过数据库查询补全:

if ($priceType === 'old') {
    $oldPrice = Db::getInstance()->getValue(
        'SELECT old_price FROM '._DB_PREFIX_.'product WHERE id_product = '.(int)$product->id
    );
    if ($oldPrice > 0) {
        $productPrice = $oldPrice;
    }
}
第三步:保存价格类型到购物车,确保结账流程一致

为了让购物车和订单页面能正确显示用户选择的价格类型,需要给ps_cart_product表新增一个字段来存储这个标识:

  1. 用phpMyAdmin或数据库管理工具执行SQL语句:
ALTER TABLE `ps_cart_product` ADD `price_type` VARCHAR(20) NULL DEFAULT 'discount' AFTER `id_product_attribute`;
  1. 回到CartController.php,在处理添加购物车的逻辑里(比如add()方法中),添加保存价格类型的代码:
// 保存价格类型到购物车项
if ($priceType) {
    Db::getInstance()->update(
        'cart_product',
        ['price_type' => pSQL($priceType)],
        [
            'id_cart' => (int)$cart->id,
            'id_product' => (int)$product->id,
            'id_product_attribute' => (int)$idProductAttribute
        ]
    );
}
  1. 修改购物车页面模板(/themes/你的主题/templates/cart/cart.tpl),添加价格类型标识,让用户清楚自己选择的价格:
<!-- 在购物车产品行的合适位置添加 -->
{if $product.price_type == 'old'}
    <span class="badge bg-warning ms-2">以原价购买</span>
{else}
    <span class="badge bg-success ms-2">以折扣价购买</span>
{/if}
第四步:测试与验证

完成以上修改后,记得做这些操作:

  • 清除PrestaShop后台缓存(路径:后台→高级参数→性能→清除缓存)
  • 打开产品详情页,确认两个按钮正常显示
  • 分别点击两个按钮加入购物车,检查购物车页面的价格和标识是否正确
  • 走完整个结账流程,确认最终订单金额与选择的价格一致
额外注意事项
  • 如果你使用的是PrestaShop 1.6版本,模板文件路径是/themes/你的主题/product.tpl,控制器逻辑基本一致
  • 修改核心文件前一定要备份!如果不想修改核心文件,也可以开发一个自定义模块来实现这个功能,这样更安全,也不会被PrestaShop更新覆盖
  • 确保后台产品编辑页面已经正确设置了old_price(原价)字段
  • 如果产品有属性(颜色、尺寸等),需要额外调整属性价格的处理逻辑,确保不同属性对应的原价/折扣价都能正确调用

内容的提问来源于stack exchange,提问作者Alex Pryl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:39:05