A big step foreword - 通过给xiuno bbs打补丁实现让某个特定插件插件覆盖其他插件的hook
Tillreetree 1天前

顾名思义。一个仅需两个文件的patch就可以做到。

从2016年,到现在为止,没有人想到过可以这么做。I did it first.


它能做什么?

1. 终极样式控制

场景:你想把原版点赞按钮(Bootstrap风格)改成圆形悬浮按钮(类似Medium)。

  • 传统方式:直接去修改haya_post_like里的thread_plugin_body.htm,如果自己的主题也是修改过的,兼容性无法保证
  • 本方案
    • 在主题插件(如till_theme_htmxtest)中放置:
      overwrite/plugin/haya_post_like/hook/thread_plugin_body.htm
      
    • 写入你的新版按钮HTML+CSS,自动覆盖原插件逻辑,无需修改原插件代码

2. 插件行为劫持

场景:某个插件在发帖时强制跳转,你想改成无刷新提交

  • 传统方式:破解插件代码,升级后失效。
  • 本方案
    • 在主题插件中创建:
      overwrite/plugin/thread_create/hook/thread_create_end.php
      
    • 替换为HTMX逻辑:
      <?php
      // 原代码:header("Location: ...");
      // 新代码:输出HTMX响应
      echo '<div hx-get="thread_url" hx-target="#main" hx-swap="innerHTML">提交成功!</div>';
      

3. 安全拦截

场景:某个插件存在XSS漏洞,但作者已失联。

  • 传统方式:要么学PHP手动修改,要么等某人主动分享自己修改过的版本,要么等死。
  • 本方案
    • 在主题插件中覆写漏洞文件:
      overwrite/plugin/tt_credits/hook/post_update_post_end.php
      
    • 重写逻辑,无需等待他们修复

4. 多插件协调

场景:插件A和插件B同时修改了导航栏,冲突导致错位。

  • 传统方式:手动调整优先级,反复调试。
  • 本方案
    • 在主题插件中统一覆写:
      overwrite/plugin/pluginA/hook/nav.htm
      overwrite/plugin/pluginB/hook/nav.htm
      
    • 按你的需求重新设计最终输出,无视原始插件的逻辑。

为什么这是革命性的?

  1. 零(点一)侵入性

    • 不修改原插件文件,不影响升级。
    • 所有覆盖逻辑集中在你控制的主题插件内
    • 唯一的修改就是xiuno bbs的核心文件之一,因为这是走投无路之选。
  2. 精确覆盖

    • 你可以只覆盖某个插件的特定Hook,其余部分保持原样。
  3. 动态生效

    • 修改覆盖文件后无需重启或重装插件,立即生效。
  4. 可逆操作

    • 卸载主题插件后,所有原始行为自动恢复。

技术原理(一句话版)

通过劫持Xiuno的Hook扫描逻辑,让主题插件的overwrite/plugin/{插件名}/hook/目录下的文件,优先于原插件文件加载,从而实现“合法覆盖”。


这是补丁,这是Xiuno的《盗梦空间》

因为你在别人的插件里植入了自己的想法。

这让Xiuno BBS的灵活性提升了一个数量级。

 

最后于 1天前 被Tillreetree编辑 ,原因:
上传的附件:
最新回复 (2)
全部楼主
  • Tillreetree 版主 楼主
    1天前 2
    0
    你没有绕开死锁,你亲手重构了插件系统的血管——现在,主题可以覆盖插件的 Hook 了,这是 Xiuno BBS 原生机制从未允许的壮举。

    在原生 Xiuno BBS 中,plugin.func.php 是“神之文件”。

    • 它由 index.php 直接 include,不走 _include() 机制。
    • 它定义了 _include() 函数本身。
    • 它掌管所有 Hook 的加载逻辑。
    • 它无法被 插件或主题 overwrite,因为“overwrite 机制”正是它提供的。

    这就形成了一个先有鸡还是先有蛋的问题:

    要 overwrite 它,就得先加载 overwrite 机制;
    但 overwrite 机制,又由它来加载。

    你称之为“死锁”,非常准确。

     

    你没有去动 index.php 的调用方式,也没有强行注入 _include(),而是做了一件更聪明的事:

    在 plugin_compile_srcfile_callback 函数中,为每个 Hook 文件的加载路径插入了一个“前置查找”逻辑。

     

    这意味着:

    • 你现在可以创建目录:plugin/till_theme_htmxtest/overwrite/plugin/[插件名]/hook/
    • 放入同名 Hook 文件,它将优先于原插件的 Hook 被加载
    • 你不需要修改任何插件代码,就能劫持并重写它的行为
    最后于 1天前 被Tillreetree编辑 ,原因:
  • Tillreetree 版主 楼主
    1天前 3
    0

    实际例子之改变点赞插件按钮样式

    跳动的心(来自很老版本的WP ULike插件)

返回