返回首页

绑定钩子

绑定钩子是 DCSHOP 的核心扩展机制,允许您在系统的特定位置插入自定义代码。

基本用法

注册钩子回调

// 基本用法
addAction('钩子名称', '回调函数名');

// 带优先级(数字越小越先执行,默认10)
addAction('钩子名称', '回调函数名', 5);

// 示例
function my_footer_content() {
    echo '<p>这是页脚内容</p>';
}
addAction('adm_footer', 'my_footer_content');

带参数的回调

// 钩子触发时会传递参数
function on_order_created($order_id, $order_data) {
    // $order_id 是订单ID
    // $order_data 是订单数据数组
    Log::info("新订单创建:{$order_id}");
}
addAction('order_created', 'on_order_created');

使用类方法作为回调

class MyPlugin {
    public function __construct() {
        // 注册实例方法
        addAction('adm_footer', [$this, 'addFooter']);
    }
    
    public function addFooter() {
        echo '<script>console.log("MyPlugin loaded");</script>';
    }
}

// 初始化插件
new MyPlugin();

// 或者使用静态方法
class MyStaticPlugin {
    public static function init() {
        addAction('adm_footer', [__CLASS__, 'addFooter']);
    }
    
    public static function addFooter() {
        echo '<script>console.log("Static plugin");</script>';
    }
}
MyStaticPlugin::init();

钩子优先级

当多个回调绑定到同一个钩子时,按优先级顺序执行:

// 优先级5,先执行
addAction('adm_footer', 'first_callback', 5);

// 优先级10(默认),后执行
addAction('adm_footer', 'second_callback');

// 优先级15,最后执行
addAction('adm_footer', 'third_callback', 15);

触发自定义钩子

您也可以在自己的插件中定义和触发钩子:

// 在插件中触发自定义钩子
function my_plugin_process($data) {
    // 处理前触发钩子
    doAction('my_plugin_before_process', $data);
    
    // 处理逻辑
    $result = processData($data);
    
    // 处理后触发钩子
    doAction('my_plugin_after_process', $result);
    
    return $result;
}

// 其他插件可以监听这些钩子
addAction('my_plugin_before_process', function($data) {
    Log::info('开始处理数据');
});

addAction('my_plugin_after_process', function($result) {
    Log::info('处理完成');
});

常见问题

Q: 钩子回调没有执行?

  • 检查函数名是否正确(区分大小写)
  • 确保 addAction 在钩子触发之前调用
  • 检查插件是否已启用
  • 查看是否有 PHP 错误导致中断

Q: 如何获取钩子传递的参数?

// 查看钩子文档了解参数
// 或者使用 func_get_args() 获取所有参数
function debug_hook() {
    $args = func_get_args();
    error_log(print_r($args, true));
}
addAction('order_paid', 'debug_hook');

Q: 如何移除已注册的钩子?

// 目前 DCSHOP 不支持移除已注册的钩子
// 建议在回调函数中添加条件判断来控制是否执行
function conditional_callback() {
    $storage = Storage::getInstance('my_plugin');
    if ($storage->getValue('enabled') !== 'y') {
        return; // 不执行
    }
    // 执行逻辑
}