绑定钩子是 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('处理完成');
});
// 查看钩子文档了解参数
// 或者使用 func_get_args() 获取所有参数
function debug_hook() {
$args = func_get_args();
error_log(print_r($args, true));
}
addAction('order_paid', 'debug_hook');
// 目前 DCSHOP 不支持移除已注册的钩子
// 建议在回调函数中添加条件判断来控制是否执行
function conditional_callback() {
$storage = Storage::getInstance('my_plugin');
if ($storage->getValue('enabled') !== 'y') {
return; // 不执行
}
// 执行逻辑
}