AI 摘要

Typecho 中 ShortLinks 与 AISummary 插件因同时占用 Widget_Abstract_Contents 的 contentEx 钩子而冲突,导致外链转换失效。解决方案为给 AISummary 的钩子追加唯一后缀,如 contentEx_AISummary,避免重复注册,两插件即可并存。

事情是这样的。

我的博客引入了两个插件:

  • ShortLinks:把文章内容中的外部链接转换为指定内部链接。
  • AISummary:调用ChatGPT、Kimi Chat等AI接口,智能提取文章摘要。

然后出现了这样的情况:两个插件同时启用后,AISummary 插件生效了,可以正常在文章头部显示文章摘要,但是 ShortLinks 插件却失效了,所有的外链并没有自动处理。

其实这个问题大概率就是因为插件冲突了,经过检查,也确实是因为插件冲突了。

ShortLinks 插件的 Plugin.php 中,有这一行代码:

Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('ShortLinks_Plugin', 'replace');

AISummary 插件的 Plugin.php 中,有这一行代码:

Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('AISummary_Plugin', 'customContent');

在插件中使用 Widget_Abstract_Contents 接口,出现插件冲突,通常是因为不同插件对同一钩子(contentEx)进行了重复注册或存在命名冲突。

解决冲突问题也很简单,只需要把钩子名称修改掉,确保唯一性即可。

比如:

// 原代码
Typecho_Plugin::factory('Widget_Abstract_Contents')->excerptEx = array('AISummary_Plugin', 'customExcerpt');
Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx = array('AISummary_Plugin', 'customContent');

// 修改后的代码
Typecho_Plugin::factory('Widget_Abstract_Contents')->excerptEx_AISummary = array('AISummary_Plugin', 'customExcerpt');
Typecho_Plugin::factory('Widget_Abstract_Contents')->contentEx_AISummary = array('AISummary_Plugin', 'customContent');

修改完成后,禁用插件后重新启动插件即可。