You need to enable JavaScript to run this app. 如何判断CS Cart Hook触发?验证change_order_status Hook正确性
优惠活动
大模型
产品
解决方案
定价
更多

如何判断CS Cart Hook触发?验证change_order_status Hook正确性

验证change_order_status Hook正确性的实操步骤

基础合规性排查(先排除低级匹配错误)

  • 确认Hook函数命名完全符合框架规则
    框架识别Hook的规则是fn_[当前插件唯一标识]_[Hook名称],你当前写的fn_dellyman_change_order_status里的dellyman,必须和你插件在系统里注册的标识完全一致,大小写、下划线偏差一个字符,框架都不会匹配到这个函数,Hook自然不会触发。
  • 确认Hook注册位置正确
    你写的fn_register_hooks('change_order_status'),必须放在对应插件根目录的init.php文件里,不能放在全局入口文件、其他模块的初始化文件中,否则框架加载插件时根本不会执行这个注册逻辑。
  • 确认调试输出被拦截
    后台切换订单状态默认走异步AJAX请求,框架会强制把响应内容封装为标准JSON格式,你写的var_dump($auth)产生的非JSON输出,会被直接拦截,这是绝大多数人看不到调试输出的核心原因。

无渲染依赖的触发验证方法

绕开页面渲染的影响,用日志记录的方式验证,不受AJAX、页面路由影响:

  1. 把Hook函数里的var_dump($auth)替换为框架原生的日志写入逻辑:
    function fn_dellyman_change_order_status(&$status_to,&$status_from,&$order_info,&$force_notification,&$order_statuses,&$place_order) {
        // 写入调试日志
        fn_log(
            'change_order_status hook triggered',
            'from: ' . $status_from . ' to: ' . $status_to . ' order_id: ' . $order_info['order_id'],
            json_encode($_SESSION['auth'])
        );
    }
    
  2. 手动在后台执行一次从open切换到complete的订单状态变更操作
  3. 查看系统日志记录:
    • 如果日志里能找到刚才写入的调试记录,说明change_order_status Hook本身选择正确,之前看不到输出只是因为AJAX流程拦截了var_dump内容
    • 如果日志里没有对应记录,说明Hook根本没被触发,继续往下排查

Hook有效性排查

  • 对照框架核心源码确认Hook的触发位置
    全局检索源码中fn_set_hook('change_order_status'的代码行,确认这个Hook是在订单状态更新的核心流程中触发,没有被放在边缘的非状态变更分支里。从框架内置的Hook定义来看,这个Hook的触发时机完全匹配「订单状态完成更新后执行后续操作(比如自动派车)」的需求,参数里的新旧状态值、订单全量信息也足够支撑派车逻辑的取数要求。
  • 核对函数参数顺序和Hook定义的一致性
    部分旧版本框架中,Hook的参数顺序、传递方式如果和定义不匹配,会直接跳过Hook调用。逐行对照源码里fn_set_hook('change_order_status'行传递的参数:既要保持参数顺序完全一致,也要保留原有的引用传递(&)格式,顺序错位、改成值传递哪怕函数名正确也无法正常触发。

快速调试的临时方案

如果不想写日志,可以临时关闭订单状态变更的AJAX请求:在触发状态切换的请求里,临时去掉ajax=1的参数,让请求变成整页刷新的同步请求,这时候你写的var_dump输出就会直接渲染在页面上,能第一时间确认是否触发,调试完成后再改回异步模式即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 19:36:03