PAYATHON 2026

如何更改 Prestashop 1.7 结账支付方式的顺序?

支付老李

结论

在 PrestaShop 1.7 的标准结账流程中,支付方式的显示顺序通常取决于支付模块在 paymentOptions Hook 中的位置。进入后台的 Hook 位置管理页面,找到 paymentOptions,拖动支付模块即可调整顺序,一般不需要修改结账模板。

调整步骤

  1. 登录 PrestaShop 后台。

  2. 进入 设计(Design)→ 位置(Positions)。

  3. 在 Hook 搜索框中输入:

    paymentOptions
    
  4. 找到挂载在该 Hook 下的支付模块。

  5. 拖动模块左侧的位置图标,把模块移到所需位置。

  6. 保存并清除 PrestaShop 缓存,然后重新打开结账页面检查结果。

PrestaShop 1.7 的不同小版本或后台主题可能使用不同的菜单名称,例如“模块位置”或“模块挂载位置”,但要查找的 Hook 都是 paymentOptions。

如果搜索不到,可以检查页面是否隐藏了部分 Hook,并启用“显示不可定位的 Hook”等选项后重新搜索。具体名称取决于后台版本和语言包。

为什么要调整 paymentOptions

PrestaShop 1.7 的支付模块通常通过以下方法向结账流程提供支付方式:

public function hookPaymentOptions($params)
{
    // 返回 PaymentOption 对象数组
}

安装模块时,一般还会注册 paymentOptions Hook:

public function install()
{
    return parent::install()
        && $this->registerHook('paymentOptions')
        && $this->registerHook('paymentReturn');
}

结账流程执行 paymentOptions Hook 时,会按照该 Hook 中保存的位置依次调用各个支付模块。因此,改变模块在 Hook 中的位置,通常也会改变它在结账页上的显示顺序。

一个模块提供多个支付方式时

后台的 Hook 位置只能控制模块之间的顺序。如果同一个模块返回多个 PaymentOption,这些选项的先后顺序由模块返回数组时的排列决定。

例如:

use PrestaShop\PrestaShop\Core\Payment\PaymentOption;

public function hookPaymentOptions($params)
{
    $cardOption = new PaymentOption();
    $cardOption
        ->setCallToActionText($this->l('Pay by card'))
        ->setAction($this->context->link->getModuleLink(
            $this->name,
            'validation',
            [],
            true
        ));

    $bankTransferOption = new PaymentOption();
    $bankTransferOption
        ->setCallToActionText($this->l('Pay by bank transfer'))
        ->setAction($this->context->link->getModuleLink(
            $this->name,
            'banktransfer',
            [],
            true
        ));

    return [
        $cardOption,
        $bankTransferOption,
    ];
}

这段代码会先显示银行卡支付,再显示银行转账。要交换两者的顺序,只需调整返回数组:

return [
    $bankTransferOption,
    $cardOption,
];

修改第三方支付模块前,先确认模块是否自带排序设置。直接改动模块源码可能会在升级时被覆盖。更稳妥的方式是使用模块配置、官方扩展机制,或者通过自建模块完成调整。

调整后没有生效怎么办

可以按下面的顺序排查。

1. 清除缓存

进入 高级参数(Advanced Parameters)→ 性能(Performance),使用后台的清除缓存功能。浏览器也可能保留旧页面,可以再用无痕窗口测试。

2. 确认调整的是正确的 Hook

在 PrestaShop 1.7 中,应重点检查:

paymentOptions

旧版支付模块可能仍在使用 displayPayment 等旧 Hook。这类模块能否正常接入 PrestaShop 1.7 的新结账流程,取决于模块本身的兼容实现,只调整旧 Hook 的位置不一定能解决问题。

3. 检查模块是否自行排序

有些支付模块会返回多个支付选项,或者使用 JavaScript、模板代码重新组织这些选项。遇到这种情况,Hook 位置只能改变整个模块的位置,不能调整模块内部选项的顺序。

4. 检查主题或结账模块

使用第三方主题、一页结账模块或自定义结账控制器时,主题或模块代码可能会再次排序支付方式。排查时,可以暂时切换到兼容的默认主题,或停用第三方结账模块。

5. 检查支付方式的显示条件

支付模块可能根据以下条件决定是否显示:

  • 当前国家或地区
  • 使用的货币
  • 客户组
  • 配送方式
  • 订单金额
  • 商店或多店配置
  • 模块自身的风控与可用性规则

测试时应尽量使用相同的客户、地址、货币、购物车和配送方式,否则支付方式的数量和排列顺序都可能发生变化。

不建议直接修改数据库

Hook 的排列位置最终保存在数据库中,但不建议直接修改 ps_hook_module 表。实际表前缀未必是 ps_,多店环境还要考虑店铺范围、模块关联和位置连续性。手工更新出错后,可能出现位置重复、模块顺序异常或后台显示不一致。

只有在后台无法调整并且已经备份数据库时,才适合检查相关记录。通常应先确认 paymentOptions 对应的 Hook,以及支付模块在当前店铺范围内的 position 值,不要直接执行未经验证的 UPDATE 语句。

注意事项

  • Hook 中的位置数字通常越小,模块越靠前。
  • 使用多店模式时,先确认后台当前选择的是单个商店、商店组还是全部商店。
  • 同一模块返回的多个支付选项,需要通过模块配置或 hookPaymentOptions() 的返回数组调整顺序。
  • 第三方结账模块可能不会采用 PrestaShop 核心结账页的默认排序逻辑。
  • 不要为了调整顺序直接修改核心文件或结账模板,否则升级 PrestaShop 后可能丢失改动。

对于标准的 PrestaShop 1.7 结账流程,优先在后台调整支付模块在 paymentOptions Hook 中的位置,通常是最直接且风险较低的做法。

备注:内容仅供参考。